ACM第十天

 动态规划2

1、树形DP

2、概率DP

3、区间DP

 模板

1 for (int len = 1; len < n; len++) { //操作区间的长度
2         for (int i = 0, j = len; j <= n; i++, j++) { //始末
3             //检查是否匹配(非必须)
4             for (int s = i; s < j; s++) {
5                 //update
6             }
7         }
8     }

石子归并

 1 #include <cstdio>
 2 #define min(x, y) (x > y ? y : x)
 3 #define INF 0x3f3f3f3f
 4 using namespace std;
 5 
 6 const int maxn = 210;
 7 int dp[maxn][maxn];
 8 int sum[maxn];
 9 int a[maxn];
10 
11 int main(int argc, const char * argv[]) {
12     
13     int n;
14     while (~scanf("%d", &n)) {
15         for (int i = 1; i <= n; i++) {
16             scanf("%d", &a[i]);
17             sum[i] = sum[i - 1] + a[i];
18         }
19         for (int len = 1; len < n; len++) { //操作区间的长度
20             for (int i = 1, j = len + 1; j <= n; i++, j++) { //始末
21                 //检查是否匹配(非必须)
22                 dp[i][j] = INF;
23                 for (int s = i; s < j; s++) {
24                     dp[i][j] = min(dp[i][j], dp[i][s] + dp[s + 1][j] + sum[j] - sum[i - 1]);
25                 }
26             }
27         }
28         printf("%d\n", dp[1][n]);
29     }
30     return 0;
31 }

4、状态DP

猜你喜欢

转载自www.cnblogs.com/weixq351/p/9458631.html