40分dp求助大佬
查看原帖
40分dp求助大佬
148092
Dark_lightrq楼主2023/7/3 19:30
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],sum[105];
inline int mod(int x){
	return ((x%10)+10)%10;
}
int f[105][105][15];
int g[105][105][15];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i+n]=a[i];
	}
	for(int i=1;i<=2*n;i++){
		sum[i]=mod(sum[i-1]+a[i]);
	}
	for(int i=1;i<=2*n;i++){
		for(int j=i;j<=2*n;j++){
			for(int k=2;k<=m;k++){
				g[i][j][k]=1e9;
			}
		}
	}
	for(int i=1;i<=2*n;i++){
		for(int j=i+1;j<=2*n;j++){
			f[i][j][1]=g[i][j][1]=mod(sum[j]-sum[i-1]);
		}
	}

	for(int i=2;i<=m;i++){
		for(int l=1;l<=2*n;l++){
			for(int r=l+i-1;r<=2*n;r++){
				for(int k=l+i-2;k<=r-1;k++){
					f[l][r][m]=max(f[l][r][m],f[l][k][m-1]*mod(sum[r]-sum[k]));
					g[l][r][m]=min(g[l][r][m],g[l][k][m-1]*mod(sum[r]-sum[k]));
				}
			}
		}
	}
	int ans0=0,ans1=1e9;
	for(int i=1;i<=n;i++){
		ans0=max(ans0,f[i][i+n-1][m]);
		ans1=min(ans1,g[i][i+n-1][m]);
	}
	cout<<ans1<<endl<<ans0;
	return 0;
} 
2023/7/3 19:30
加载中...