intさわだんのBlack History

刹那的レジェンドになりたい。

*不完全 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);

}