合并金子(区间dp)
作者:互联网
原题链接
很久没做dp了,连一道裸地区间dp都没能第一时间想到,我可真是个臭弟弟......
一开始是用的贪心吧,wa了一发。
本题思路:区间dp的一般思路,先枚举区间长度,然后枚举区间头,然后枚举区间断点,很容易就能想到状态转移方程。
自己关掉博客好好想想吧,区间dp应该是最简单的dp类型了。
#include <iostream> using namespace std; const int maxn = 30 + 5, inf = 0x3f3f3f3f; int val[maxn], sum[maxn][maxn], dp[maxn][maxn]; int n; int main() { cin >> n; for(int i = 1; i <= n; i ++) { cin >> val[i]; sum[i][i] = val[i]; } for(int i = 1; i <= n; i ++) { for(int j = i; j < n; j ++) { sum[i][j + 1] = sum[i][j] + val[j + 1]; } } for(int len = 1; len < n; len ++) { for(int i = 1; i + len <= n; i ++) { int j = i + len; dp[i][j] = inf; for(int k = i; k <= j; k ++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[i][j]); } } } cout << dp[1][n] << endl; return 0; }
标签:金子,val,int,合并,枚举,maxn,区间,dp 来源: https://www.cnblogs.com/bianjunting/p/12553762.html