题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
---|---|---|---|---|---|
能量项链 | ★☆☆☆☆ | 答案正确 | 100 | 2014/11/26 17:07:33 | 无 |
环形石子归并问题。
石子归并的变题了,环形石子归并其实只要复制一遍接在后面,按照石子归并做就是了,例如:
1 2 3 4 5 -> 1 2 3 4 5 1 2 3 4
DP方程也是类似的:
dp[i][j]=max{dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k]};
1154.cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> #include<climits> #include<algorithm> int dp[5000][5000]={},n,h[5000]={},sum[5000]={},n0,Ans=0; int main() { scanf("%d",&n0); for (int i=1;i<=n0;i++) { scanf("%d",&h[i]); h[i+n0]=h[i]; } n=(n0<<1)-1; for (int len=2;len<=n0;len++) for (int i=1;i<=n-len+1;i++) { int j=i+len-1; for (int k=i+1;k<=j;++k) if (dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k]>dp[i][j]) dp[i][j]=dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k]; } for(int i=1;i<=n0;++i) Ans=std::max(Ans,dp[i][i+n0-1]); printf("%d",Ans); return 0; } |