*不完全 JOI本選過去問 第7回 日本情報オリンピック本選 4問目 ぴょんぴょん川渡り
なぜかACにならない、なぜだ。
いくつか原因はわかっているけど保留。。。
#include <cstdio> #include <algorithm> using namespace std; int n=0,m=0; const int INF = 100000000; int dp[153][12][80] = {0}; int ko[152] = {0}; int d[103][12][2] = {0}; int main(){ scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++){ scanf("%d",&ko[i-1]); for(int j = 0;j < ko[i-1];j++){ scanf("%d%d",&d[i][j][0],&d[i][j][1]); } } for(int i = 0;i < ko[n-2];i++){ dp[n-1][i][0] = (d[n][0][1]+d[n-1][i][1])*abs(d[n][0][0]-d[n-1][i][0]); for(int j = 1;j < ko[n-1];j++){ dp[n-1][i][0] =min( dp[n-1][i][0], (d[n][j][1]+d[n-1][i][1])*abs(d[n][j][0]-d[n-1][i][0])); } } for(int i = n - 2;i >= 0;i--){ for(int j = 0;j < ko[i-1];j++){ for(int k = 0;k <= m;k++){ dp[i][j][k] = dp[i+1][0][k] + (d[i][j][1]+d[i+1][0][1])*abs(d[i][j][0]-d[i+1][0][0]); for(int l = 1;l < ko[i+1];l++){ dp[i][j][k] = min( dp[i][j][k], dp[i+1][l][k] + (d[i][j][1]+d[i+1][l][1])*abs(d[i][j][0]-d[i+1][l][0])); } if(k >= 1){ for(int l = 0;l < ko[i+2];l++){ dp[i][j][k] = min(dp[i][j][k],dp[i+2][l][k-1]+(d[i][j][1]+d[i+2][l][1])*abs(d[i][j][0]-d[i+2][l][0])); } } } } } int ans = dp[1][0][0]; for(int i = 0;i < ko[0];i++){ for(int j = 0;j <= m;j++){ ans = min(ans,dp[1][i][j]); // printf(" %d\n",dp[1][i][j]); } } for(int i = 0;i < ko[1];i++){ for(int j = 0;j < m;j++){ ans = min(ans,dp[2][i][j]); } } printf("%d\n",ans); }