摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
石子归并3 ★☆☆☆☆ 答案正确 100 2014/11/20 8:16:04

题意

较大范围的石子归并。

题解

参见CodeVS/1048

代码

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

著作权声明[编辑]

关于[编辑]