博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ 737 石子合并(一)
阅读量:6191 次
发布时间:2019-06-21

本文共 1308 字,大约阅读时间需要 4 分钟。

分析:

本题为区间型动态规划,dp[i][j] 表示从第 i 堆合并到第 j 堆的最小代价,

sum[i][i] 表示第 i 堆到第 j 堆的石子总和,则动态转移方程:

dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j])  (i <= k <= j - 1)。

代码如下:

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxn = 200 + 5; 6 const int INF = 1000000000; 7 int dp[maxn][maxn], sum[maxn][maxn], stone[maxn]; 8 int main() 9 {10 int n;11 int i, j, k;12 while(~scanf("%d", &n))13 {14 for(i = 1; i <= n; i ++)15 scanf("%d", &stone[i]);16 for(i = 1; i <= n; i ++)17 {18 dp[i][i] = 0; //不合并,代价为019 sum[i][i] = stone[i];20 for(j = i + 1; j <= n; j ++)21 sum[i][j] = sum[i][j - 1] + stone[j];22 }23 for(int dui = 2; dui <= n; dui ++) //合并石子的堆数24 {25 for(i = 1; i <= n - dui + 1; i ++) //从第 i 堆到第 j 堆26 {27 j = dui + i - 1;28 dp[i][j] = INF;29 for(k = i; k <= j - 1; k ++)30 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j]);31 }32 }33 printf("%d\n", dp[1][n]);34 }35 return 0;36 }
View Code

转载于:https://www.cnblogs.com/Houheshuai/p/3867524.html

你可能感兴趣的文章
秒级展现的百万级大清单报表怎么做
查看>>
什么是ground truth(GT)
查看>>
读取C#AssemblyInfo文件中的AssemblyVersion中的值
查看>>
CRM 相关术语 (一)
查看>>
Makefile 使用总结
查看>>
P4035 [JSOI2008]球形空间产生器
查看>>
Codeforces Round #239 (Div. 1) 解题报告
查看>>
第一天开通博客纪念一下吧
查看>>
b/s结构和c/s结构
查看>>
前台vue的使用简单小结
查看>>
Linux-DNS服务-主域名服务器的配置(中)
查看>>
Python之 Virtualenv简明教程
查看>>
蛤车1:两个习题,群作用与覆叠空间,N-S定理
查看>>
hibernate自动生成数据库表
查看>>
DateUtil
查看>>
贝叶斯分类器
查看>>
输入长整形数据输出对应的十六进制字符串
查看>>
Swing的Look And Feel机制研究
查看>>
linux 使用记录
查看>>
博客网站参考
查看>>