摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
能量项链 ★☆☆☆☆ 答案正确 100 2014/11/26 17:07:33

题意

环形石子归并问题。

题解

石子归并的变题了,环形石子归并其实只要复制一遍接在后面,按照石子归并做就是了,例如:

显示/移除行号
  1. 1 2 3 4 5 -> 1 2 3 4 5 1 2 3 4

DP方程也是类似的:

显示/移除行号
  1. dp[i][j]=max{dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k]};

代码

1154.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<climits>
  3. #include<algorithm>
  4. int dp[5000][5000]={},n,h[5000]={},sum[5000]={},n0,Ans=0;
  5. int main()
  6. {
  7. scanf("%d",&n0);
  8. for (int i=1;i<=n0;i++)
  9. {
  10. scanf("%d",&h[i]);
  11. h[i+n0]=h[i];
  12. }
  13. n=(n0<<1)-1;
  14.  
  15. for (int len=2;len<=n0;len++)
  16. for (int i=1;i<=n-len+1;i++)
  17. {
  18. int j=i+len-1;
  19. for (int k=i+1;k<=j;++k)
  20. if (dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k]>dp[i][j])
  21. dp[i][j]=dp[i][k-1]+dp[k][j]+h[j+1]*h[i]*h[k];
  22. }
  23. for(int i=1;i<=n0;++i)
  24. Ans=std::max(Ans,dp[i][i+n0-1]);
  25. printf("%d",Ans);
  26. return 0;
  27. }

著作权声明[编辑]

关于[编辑]