标签:style blog http color os io ar for art
区间动态规划是从区间的角度来考虑问题的。对于每段区间,它的最优值是由几段更小的区间的最优值得到,这算是分治思想的一种应用吧。
就拿http://acm.fafu.edu.cn/problem.php?id=1502
合并石子这一题来说。要求得区间1-->n石子合并的最小花费
设dp[1][n] 为合并区间1--->n的最小花费。
区间的最后一次合并一定是1--->k 与 k+1-->n合并
所以合并区间1--->k的花费最小,和合并区间k+1--->n的花费最小,才能使得合并区间1--->n的花费最小。
所以状态转移方程为:dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); sum[i]表示前i堆石子的总个数。
方程的思想是在区间的角度上来思考问题的,一个大区间的问题转化为两个小区间的问题
1 #include <stdio.h> 2 const int INF = 1 << 30; 3 const int N = 100 + 10; 4 int dp[N][N],sum[N]; 5 int min(const int &a, const int &b) 6 { 7 return a < b ? a : b; 8 } 9 int main() 10 { 11 int n,i,j,k,z; 12 scanf("%d",&n); 13 for(i=1; i<=n; ++i) 14 for(j=1; j<=n; ++j) 15 dp[i][j] = INF; 16 for(i=1; i<=n; ++i) 17 { 18 scanf("%d",&sum[i]); 19 sum[i] += sum[i-1]; 20 dp[i][i] = 0; 21 } 22 for(z=2; z<=n; ++z)//枚举区间的长度 23 for(i=1; i<=n-z+1; ++i)//枚举区间的起点 24 { 25 j = i + z - 1; 26 for(k=i; k<j; ++k)//枚举区间的断点,将区间分为两个更小的区间。 27 dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]+sum[j] - sum[i-1]); 28 } 29 printf("%d\n",dp[1][n]); 30 }
标签:style blog http color os io ar for art
原文地址:http://www.cnblogs.com/justPassBy/p/3957790.html