题目:
http://acm.hdu.edu.cn/showproblem.php?pid=4283
#include <cstdio> #include <iostream> #define INF 0x3f3f3f3f using namespace std; int d[105]; int sum[105]; int dp[105][105]; int main () { int T, n; scanf("%d", &T); for(int kase=1; kase<=T; kase++) { scanf("%d", &n); for(int i=1; i<=n; i++) { scanf("%d", &d[i]); sum[i] = sum[i-1] + d[i]; } for(int step=1; step<n; step++) { for(int i=1; i+step<=n; i++) { int j = i+step; dp[i][j] = INF; for(int k=i; k<=j; k++) { int cur = dp[i+1][k]+(k-i)*d[i]; cur += dp[k+1][j]+(sum[j]-sum[k])*(k-i+1); // 加回来,变成后面部分真正的值 dp[i][j] = min(dp[i][j], cur); } } } printf("Case #%d: %d\n", kase, dp[1][n]); } return 0; }