区间dp三个点WA求调QAQ
查看原帖
区间dp三个点WA求调QAQ
591179
huangyuxaing楼主2022/8/14 16:02
#include<bits/stdc++.h>
using namespace std;
long long n,m,dp[105][105][105],a[105],f[105][105][105],maxn,minn=1e18,sum[105];//表示把区间【i,j】分成k段的最优值 (第k段第一个数为l 
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		a[i+n]=a[i];
	}
	for(int i=1;i<2*n;i++)sum[i]=sum[i-1]+a[i];
	for(int i=1;i<=2*n;i++){
		for(int j=i;j<=2*n;j++){
			for(int k=1;k<=m;k++){
				f[i][j][k]=1e15;
			}
		}
	}
	for(int i=1;i<=2*n;i++){
		for(int j=i;j<=2*n;j++){
			f[i][j][1]=dp[i][j][1]=abs(sum[j]-sum[i-1])%10;
		}
	}
	for(int k=2;k<=m;k++){
		for(int i=1;i<=n;i++){
			for(int j=i+k-1;j<=2*n;j++){
				for(int l=i+k-1;l<=j;l++){
					long long he=(sum[j]-sum[l-1])%10;
					if(he<0)he+=10;
					dp[i][j][k]=max(dp[i][j][k],dp[i][l-1][k-1]*he);
					f[i][j][k]=min(f[i][j][k],f[i][l-1][k-1]*he);
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		maxn=max(maxn,dp[i][i+n-1][m]);
		minn=min(minn,f[i][i+n-1][m]);
	}
	printf("%lld\n%lld\n",minn,maxn);
	return 0;
}
2022/8/14 16:02
加载中...