《算法竞赛进阶指南》0x5B四边形不等式 利用四边形不等式优化石子合并问题

经典的石子合并问题,代价w(i,j)满足四边形不等式的性质,所以可以通过决策的单调性求解

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 500;
int f[N][N];
int p[N][N];
int n;
int sum[N];
int main(){
    cin>>n;
    int x;
    for(int i=1;i<=n;i++){
        cin>>x;
        sum[i]=sum[i-1]+x;
    }
    
    memset(f,0x3f,sizeof f);
    memset(p,0,sizeof p);
    for(int i=1;i<=n;i++)f[i][i]=0,p[i][i]=i;
    
    for(int len=2;len<=n;len++)
        for(int i=1;i+len-1<=n;i++)
        {
            int j=i+len-1;
            for(int k=p[i][j-1];k<=p[i+1][j];k++){
                if(f[i][j]>f[i][k]+f[k+1][j]+sum[j]-sum[i-1]){
                    f[i][j]=f[i][k]+f[k+1][j]+sum[j]-sum[i-1];
                    p[i][j]=k;
                }
            }
        }
        
    cout<<f[1][n]<<endl;
}

 

posted @ 2020-08-05 12:03  WA自动机~  阅读(212)  评论(0编辑  收藏  举报