HDU5115(区间DP)
2015-10-07 19:18
246 查看
不知为何贪心跪了。
后来换了DP。
后来换了DP。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <vector> #include <queue> using namespace std; #define maxn 211 #define maxm 121111 #define INF 10000000000000 long long dp[maxn][maxn]; int n; long long a[maxn], b[maxn]; int main () { int t, kase = 0; scanf ("%d", &t); while (t--) { scanf ("%d", &n); for (int i = 1; i <= n; i++) { scanf ("%lld", &a[i]); } for (int i = 1; i <= n; i++) { scanf ("%lld", &b[i]); } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (j >= i) dp[i][j] = INF; else dp[i][j] = 0; } } a[0] = b[0] = a[n+1] = b[n+1] = 0; for (int i = 1; i <= n; i++) { dp[i][i] = a[i]+b[i-1]+b[i+1]; } for (int l = 1; l <= n-1; l++) { for (int i = 1; i+l <= n; i++) { for (int j = i; j <= i+l; j++) { dp[i][i+l] = min (dp[i][i+l], dp[i][j-1]+dp[j+1][i+l]+a[j]+b[i-1]+b[i+l+1]); } } } printf ("Case #%d: %lld\n", ++kase, dp[1] ); } return 0; }