码迷,mamicode.com
首页 > 其他好文 > 详细

区间dp

时间:2014-09-05 12:54:41      阅读:176      评论:0      收藏:0      [点我收藏+]

标签: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堆石子的总个数。
方程的思想是在区间的角度上来思考问题的,一个大区间的问题转化为两个小区间的问题

bubuko.com,布布扣
 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 }
View Code

 

区间dp

标签:style   blog   http   color   os   io   ar   for   art   

原文地址:http://www.cnblogs.com/justPassBy/p/3957790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!