NYOJ 石子合并(一)(区间DP)
2016-09-26 23:19
323 查看
石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。 输入 有多组测试数据,输入到文件结束。 每组测试数据第一行有一个整数n,表示有n堆石子。 接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出 输出总代价的最小值,占单独的一行 样例输入 3 1 2 3 7 13 7 8 16 21 4 18 样例输出 9 239
区间动态规划:
#include<iostream> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<ctime> #include<string> #include<stack> #include<deque> #include<queue> #include<list> #include<set> #include<map> #include<cstdio> #define mes(x) memset(x, 0, sizeof(x)) #define Pii pair<int, int> #define Pll pair<ll, ll> #define INF 1e9+7 typedef long long ll; using namespace std; const int MAX = 101; #define MOD 1000000007 //#define test #define time int sum[201]; int dp[201][201]; int main() { #ifdef test freopen("/home/ostreambaba/文档/input.txt", "r", stdin); //freopen("/home/ostreambaba/文档/output.txt", "w", stdout); #endif int N, stone; while(cin >> N){ mes(sum); for(int i = 1; i <= N; ++i){ scanf("%d" , &stone); sum[i] = sum[i-1] + stone; } memset(dp, 0x3f, sizeof(dp)); for(int i = 1; i <= N; ++i){ dp[i][i] = 0; } for(int i = 1; i < N; ++i){ for(int j = 1; j <= N - i; ++j){ for(int k = j; k <= j + i - 1; ++k){ dp[j][i+j] = min(dp[j][j+i], dp[j][k]+dp[k+1][j+i]+sum[i+j]-sum[j-1]); } } } cout << dp[1] << endl; } return 0; }
相关文章推荐
- Nyoj 737: 石子合并(一)(区间DP+四边形优化)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ 737 石子合并(一) (区间DP+平行四边形优化)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ 石子合并(一) 区间dp入门级别
- NYOJ 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- 区间DP-NYOJ737石子合并
- nyoj 737 石子合并(一) 【区间dp】
- NYOJ 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- 【区间DP】NYOJ 737石子合并+POJ 2955 Brackets(括号匹配)+NYOJ 15 括号匹配(二)
- nyoj737石子合并【区间dp】
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- nyoj 737 石子合并(一)(区间DP)
- NYoj737 石子合并(区间dp)