区间DP(学习笔记)
P1880 [NOI1995] 石子合并
特点:
考虑是一个环,这我们可以将整个序列复制一份到末尾,使其成为
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=200;
int maxn[N][N],minn[N][N];
int a[N],sum[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=(n<<1);i++){
sum[i]=sum[i-1]+a[i];
maxn[i][i]=0;
minn[i][i]=0;
}
for(int len=2;len<=n;len++){
for(int i=1;i<=2*n-len+1;i++){
int j=i+len-1;
maxn[i][j]=INT_MIN;
minn[i][j]=INT_MAX;
for(int k=i;k<j;k++){
maxn[i][j]=max(maxn[i][j],maxn[i][k]+maxn[k+1][j]);
minn[i][j]=min(minn[i][j],minn[i][k]+minn[k+1][j]);
}
minn[i][j]+=sum[j]-sum[i-1];
maxn[i][j]+=sum[j]-sum[i-1];
}
}
int mn=INT_MAX,mx=INT_MIN;
for(int i=1;i<=n;i++){
mn=min(mn,minn[i][i+n-1]);
mx=max(mx,maxn[i][i+n-1]);
}
cout<<mn<<"\n"<<mx;
}
练习: