CSU-1592 石子归并(区间dp)
2017-07-08 16:45
330 查看
题意:现在有n堆石子,第i堆有ai个石子。现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数。求合并所有石子的最小代价。
思路:入门博文讲的很详细,下面看自己的代码细节。
状态转移方程:dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]).
Code:
继续加油~
思路:入门博文讲的很详细,下面看自己的代码细节。
状态转移方程:dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]).
Code:
#include <algorithm> #include <iostream> #include <string.h> #include <cstdio> #define LL long long using namespace std; const int maxn = 105; int dp[maxn][maxn], sum[maxn]; int main() { int 4000 n, x, t; scanf("%d", &t); while(t--) { scanf("%d", &n); memset(dp, 0x3f, sizeof dp); for(int i = 1; i <= n; ++i) dp[i][i] = 0; sum[0] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &x); sum[i] = sum[i-1] + x; } for(int len = 2; len <= n; ++len) //区间长度从小到大枚举 for(int i = 1; i <= n-len+1; ++i) //起点 { int j = i+len-1; //根据起点和区间长度得到终点 for(int k = i; k < j; ++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] ); } return 0; }
继续加油~
相关文章推荐
- CSUOJ - 1592石子归并(区间DP)
- 石子归并 CSU - 1592 (区间dp,线性dp)
- CSU 1592:石子归并(区间DP)
- csu 1592 石子归并(区间DP)
- CSU 1592 石子归并(区间dp)
- CSUOJ 1592 石子归并(区间DP)
- CSU 1592 石子归并 相邻操作Dp问题
- 区间DP——1048 石子归并 codevs
- [nyoj737]石子归并(区间dp入门题)
- [codevs1048]石子归并 区间dp经典
- 51nod 1021 石子归并(区间dp 详细解释)
- 【日常学习】【区间DP】codevs1048 石子归并题解
- Codevs 1048 石子归并 区间DP
- 【51nod】1022 石子归并V2 区间DP
- 51nod oj 1022 石子归并 V2 【环形区间DP----四边形不等式优化】
- 区间DP:POJ 2955括号匹配 + NYOJ 737 石子归并(一) + No.312 Burst Balloons
- Codevs2102[石子归并 2] 区间DP
- 区间dp模型(石子归并)
- 南阳理工OJ 石子归并(经典区间DP)
- 区间dp模型(石子归并,括号匹配,整数划分)