石子合并【区间dp】
来源:互联网 发布:卡莫尔塔级护卫舰知乎 编辑:程序博客网 时间:2024/05/21 10:50
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=737
假设dp[1][4]表示将区间1~4的石子合并所花费的代价。dp[1][4]可以划分为dp[1][1]+dp[2][4]、dp[1][2]+dp[3][4]、dp[1][3]+dp[4][4]。还可以往下继续划分。这是划分的区间层次图:
我们只需要用dp从下往上推就行了。我们可以用一个sum数组来存储一段区间内的合并代价。用k来表示分割点,尝试区间内所有可能的分割,取代价最小的那个。
转移方程:dp[begin][end]=dp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1];
代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define inf 1<<30int dp[210][210],sum[210],a[210];int main(){ int n; while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) scanf("%d",&a[i]); sum[0]=0; for(int i=1; i<=n; i++) sum[i]=sum[i-1]+a[i]; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) if(i==j) dp[i][j]=0; else dp[i][j]=inf; } for(int i=1; i<n; i++)//合并的次数 { for(int begin=1; begin+i<=n; begin++) { int end=i+begin; for(int k=begin; k<end; k++) { if(dp[begin][end]>dp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1]) dp[begin][end]=dp[begin][k]+dp[k+1][end]+sum[end]-sum[begin-1]; } } } printf("%d\n",dp[1][n]); } return 0;}
阅读全文
0 0
- 石子合并 (区间DP)
- 石子合并 (区间dp)
- 石子合并(区间dp)
- <区间DP> 石子合并
- [区间DP]石子合并
- 合并石子,区间DP
- 石子合并【区间dp】
- 区间dp 石子合并
- 石子合并~区间dp基础
- 区间DP-石子合并(线性)
- 石子合并与区间dp
- 石子合并(区间dp)
- 石子合并 (区间DP)
- nyoj+区间dp石子合并
- nyoj737石子合并【区间dp】
- nyoj737 石子合并 区间dp
- 区间DP-NYOJ737石子合并
- 【tyvj】【区间dp】石子合并
- CC2640R2F BLE5.0 使用CCS开发蓝牙应用
- ios简单登陆界面
- AttributeError: module 'tensorflow' has no attribute 'pack'
- Hdu 3586 Information Disturbing 树型DP 删边
- Git
- 石子合并【区间dp】
- golang redigo 在高并发下的问题。连接池占满CPU
- To my boyfriend
- 数组分组 二维数组中,将某个键值相同的合并到一个数组
- 字母统计
- Hibernate向数据库中添加数据报错Duplicate entry '0' for key 'PRIMARY'
- 百度地图web 关键字输入智能提示 省市区限制
- C++字符串和字符串结束标志
- ORA-28000: the account is locked-的解决办法