2 2 1 10 4 9 3 5 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15
1 1
开始用深搜,结果超时,换成O(n^3)的DP竟然过了,看来时间复杂度分析还是不过关唉。
#include <stdio.h> #include <stdlib.h> #include <string.h> bool arr[21][502]; int dp[21][502]; int main(){ int n, k, t, minlen; while(scanf("%d%d", &n, &k) == 2){ memset(arr, 0, sizeof(arr)); memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; ++i) for(int j = 1; j <= k; ++j){ scanf("%d", &t); arr[i][t] = 1; } for(int i = 2; i <= n; ++i){ for(int j = 1; j <= 501; ++j){ if(i == 2 && arr[i][j]){ for(int k = 0; k < 501; ++k){ if(arr[i-1][k]){ if(dp[i][j] == 0) dp[i][j] = dp[i-1][k] + abs(k - j); else if(dp[i-1][k] + abs(k - j) < dp[i][j]) dp[i][j] = dp[i-1][k] + abs(k - j); } } continue; } if(arr[i][j]){ for(int k = 0; k < 501; ++k){ if(dp[i-1][k]){ if(dp[i][j] == 0) dp[i][j] = dp[i-1][k] + abs(k - j); else if(dp[i-1][k] + abs(k - j) < dp[i][j]) dp[i][j] = dp[i-1][k] + abs(k - j); } } } } } minlen = 0; for(int i = 1; i < 501; ++i) if(dp[n][i]){ if(!minlen) minlen = dp[n][i]; else if(dp[n][i] < minlen) minlen = dp[n][i]; } printf("%d\n", minlen); } return 0; }
HDOJ4540 威威猫系列故事——打地鼠 【DP】,布布扣,bubuko.com
原文:http://blog.csdn.net/chang_mu/article/details/25397263