[NOI1995]石子合并 四边形不等式优化

链接

https://www.luogu.org/problemnew/show/P1880

思路

总之就是很牛逼的四边形不等式优化
复杂度\(O(n^2)\)

代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=207;
int read() {
    int x=0,f=1;char s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
int n,a[N],sum[N],f[2][N][N],g[N][N];
inline int max(int a,int b) {return a>b?a:b;}
inline int min(int a,int b) {return a>b?b:a;}
int main() {
    n=read();
    for(int i=1;i<=n;++i) a[i+n]=a[i]=read();
    for(int i=1;i<=n+n;++i) sum[i]=sum[i-1]+a[i];
    memset(f[0],0x3f,sizeof(f[0]));
    for(int i=1;i<=n+n;++i) f[0][i][i]=f[1][i][i]=0,g[i][i]=i; 
    for(int len=2;len<=n;++len) {
        for(int i=1;i<=n+n;++i) {
            int j=i+len-1;
            if(j>n+n) continue;
            f[1][i][j]=max(f[1][i][j-1],f[1][i+1][j])+sum[j]-sum[i-1];
            for(int k=g[i][j-1];k<=g[i+1][j];++k) {
                if(f[0][i][j]>f[0][i][k]+f[0][k+1][j]+sum[j]-sum[i-1]) {
                    f[0][i][j]=f[0][i][k]+f[0][k+1][j]+sum[j]-sum[i-1];
                    g[i][j]=k;  
                }
            }
        }
    }
    int ans[2]={0x3f3f3f3f,-0x3f3f3f3f};
    for(int i=1;i<=n;++i) {
        ans[0]=min(ans[0],f[0][i][i+n-1]);
        ans[1]=max(ans[1],f[1][i][i+n-1]);  
    }
    printf("%d\n%d\n",ans[0],ans[1]);
    return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/10439923.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值