51Nod 1021 石子归并
2017-11-08 22:42
204 查看
题意:N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价
解题思路:区间dp.dp[i][j]表示合并从i到j的最小代价,根据之前总结的区间dp就可以推出来的
代码:
解题思路:区间dp.dp[i][j]表示合并从i到j的最小代价,根据之前总结的区间dp就可以推出来的
代码:
#include <iostream> #include <algorithm> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> using namespace std; #define INF 0x3f3f3f3f int n; int dp[110][110]; int sum[110]; void solve_dp() { for(int l=1;l<=n;l++) { for(int i=1;i<=n;i++) { int j=i+l-1; if(j>n)break; for(int k=i;k<=j-1;k++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); } } } printf("%d\n",dp[1] ); } int main() { while(scanf("%d",&n)==1) { memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); sum[i]=sum[i-1]+x; } for(int i=1;i<=n;i++) { fill(dp[i],dp[i]+n+1,INF); } for(int i=1;i<=n;i++) { dp[i][i]=0; } solve_dp(); } return 0; } /* 4 1 2 3 4 */
相关文章推荐
- 51Nod - 1021石子归并(区间DP)
- 1021 石子归并-51Nod
- 51nod 1021 石子归并(动态规划)
- 51nod 1021 石子归并(区间dp 详细解释)
- 51nod 1021 石子归并
- 51Nod-1021-石子归并
- 51nod 1021 石子归并
- 51nod 1021 石子归并
- 51nod 1021 石子归并 (动态规划 简单代码)
- 51Nod 1021 石子归并v1
- 51nod 1021 石子归并
- 51Nod 1021 石子归并
- 51nod 1021 石子归并 dp
- 51nod 1021 石子归并(区间dp)
- 51nod 1021石子归并 dp
- 51nod 1021 石子归并
- 【51nod】1021 石子归并
- 51Nod - 1021 石子归并 区间DP入门-分析
- 51Nod - 1021 石子归并(经典dp)
- 经典问题二.【区间dp】石子归并 51nod 1021