区间dp:石子合并

例题:添加链接描述

#include
#include
#include
#include
#include
#include
const int inf=1e9;
using namespace std;
int n;
int a[210];
int sum[210]={0};
int maxx=-inf;
int minx=inf;
int kmax[210][210],kmin[210][210];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		a[i+n]=a[i];
	}
	for(int i=1;i<=n+n;i++)
		sum[i]=sum[i-1]+a[i];
	memset(kmax,0,sizeof(kmax));
	memset(kmin,0,sizeof(kmin));
	for(int len=1;len<n;len++){
		for(int i=1;i<n+n-len;i++){
			int j=i+len;
			kmax[i][j]=-inf;
			kmin[i][j]=inf;
			for(int k=i;k<j;k++){
				kmax[i][j]=max(kmax[i][j],kmax[i][k]+kmax[k+1][j]+sum[j]-sum[i-1]);
				kmin[i][j]=min(kmin[i][j],kmin[i][k]+kmin[k+1][j]+sum[j]-sum[i-1]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		maxx=max(maxx,kmax[i][i+n-1]);
		minx=min(minx,kmin[i][i+n-1]);
	}
	printf("%d\n%d",minx,maxx);
    return 0;
}

你可能感兴趣的:(动态规划)