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

区间DP

时间:2019-06-16 16:15:00      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:while   const   col   div   ace   ons   cos   c++   clu   

定义:区间DP,顾名思义是在区间上DP,它的主要思想就是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并求大区间的最优解。

动态转移方程一般为dp[i][j]=opt(dp[i][k]+dp[k+1][j]+cost[i][j])

经典例题:取石子问题
很容易根据动态转移方程得出O(n^3)的解法,但是也可以通过四边形不等式优化到O(n^2)
四边形不等式:如果对于任意的a<b<c<d,有m[a,c]+m[b,d]<=m[a,d]+a[b,c],那么m[i,j]满足四边形不等式
对于这个问题,令m[i,j]为取[i,j]石子的最小代价,s[i,j]为取得m[i,j]对应的k值。
首先可以通过数学归纳法证明m[i,j]满足四边形不等式,此处略去。
满足四边形不等式之后就可以证明s[i,j-1]≤s[i,j]≤s[i+1,j],从而可以缩小迭代范围。

百度百科上对s[i,j-1]≤s[i,j]≤s[i+1,j]的证明:
设mk[i,j]=m[i,k]+m[k,j],s[i,j]=d
对于任意k<d,有mk[i,j]≥md[i,j](这里以m[i,j]=min{m[i,k]+m[k,j]}为例,max的类似),接下来只要证明
mk[i+1,j]≥md[i+1,j],那么只有当s[i+1,j]≥s[i,j]时才有可能有mk[i+1,j]≥md[i+1,j]
(mk[i+1,j]-md[i+1,j])-(mk[i,j]-md[i,j])
=(mk[i+1,j]+md[i,j])-(md[i+1,j]+mk[i,j])
=(m[i+1,k]+m[k,j]+m[i,d]+m[d,j])-(m[i+1,d]+m[d,j]+m[i,k]+m[k,j])
=(m[i+1,k]+m[i,d])-(m[i+1,d]+m[i,k])
∵m满足四边形不等式,∴对于i<i+1≤k<d有m[i+1,k]+m[i,d]≥m[i+1,d]+m[i,k]
∴(mk[i+1,j]-md[i+1,j])≥(mk[i,j]-md[i,j])≥0
∴s[i,j]≤s[i+1,j],同理可证s[i,j-1]≤s[i,j]
证毕

#include<bits/stdc++.h>
using namespace std;

const int N=205;
const int INF=0x7fffffff;
int n;
int a[N],sum[N],dp[N][N],s[N][N];

int main(){
    while(~scanf("%d",&n)){
        sum[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i];
        }
        for(int i=1;i<=n;i++) dp[i][i]=0,s[i][i]=i;
        for(int r=1;r<n;r++){
            for(int i=1;i<n;i++){
                int j=i+r;
                if(j>n) break;
                dp[i][j]=INF;
                for(int k=s[i][j-1];k<=s[i+1][j];k++){
                    if(dp[i][j]>dp[i][k]+dp[k+1][j]){
                        dp[i][j]=dp[i][k]+dp[k+1][j];
                        s[i][j]=k;
                    }
                }
                dp[i][j]+=sum[j]-sum[i-1];
            }
        }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}   

 

区间DP

标签:while   const   col   div   ace   ons   cos   c++   clu   

原文地址:https://www.cnblogs.com/hanasaki/p/11031382.html

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