动态规划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