标签:
题目链接
http://acm.split.hdu.edu.cn/showproblem.php?pid=4283
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <set> using namespace std; const int inf=0x7fffffff; int v[105]; int dp[105][105]; int sum[105]; int main() { int T,n,Case=1; cin>>T; while(T--) { scanf("%d",&n); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&v[i]); sum[i]=sum[i-1]+v[i]; } for(int i=1;i<=n;i++) dp[i][i]=0; for(int len=1;len<n;len++) { for(int i=1;i+len<=n;i++) { ///特判i在i~i+len的区间中是第一个和最后一个时的情况; dp[i][i+len]=min(sum[i+len]-sum[i]+dp[i+1][i+len],dp[i+1][i+len]+v[i]*len); for(int k=2;k<=len;k++) dp[i][i+len]=min(dp[i][i+len],v[i]*(k-1)+dp[i+1][i+k-1]+(sum[i+len]-sum[i+k-1])*k+dp[i+k][i+len]); } } printf("Case #%d: %d\n",Case++,dp[1][n]); } }
HDU 4283---You Are the One(区间DP)
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5860145.html