「区间DP」「洛谷P1043」数字游戏

「洛谷P1043」数字游戏

日后再写

代码

/*#!/bin/sh
dir=$GEDIT_CURRENT_DOCUMENT_DIR
name=$GEDIT_CURRENT_DOCUMENT_NAME
pre=${name%.*}
g++ -O2 $dir/$name -o $pre -g -Wall -std=c++11
if test $? -eq 0; then
    gnome-terminal -x bash -c "time $dir/$pre;echo;read;"
fi*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=1e2+5,INF=0x3f3f3f3f,mol=10;
int n,m,f[maxn][maxn][12],a[maxn],sum[maxn][maxn],ans1,ans2=INF,g[maxn][maxn][12];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
	return s*w;
}
int mod(int a){
	return ((a%10)+10)%10;
}
int main(){
	freopen("a.in","r",stdin);
	n=read();m=read();
	for(int i=1;i<=n;i++)a[i]=a[i+n]=read();
	for(int i=1;i<=n*2;i++)a[i]+=a[i-1];
	for(int i=1;i<=n*2;i++){
		for(int j=i;j<=2*n;j++){
			g[i][j][1]=f[i][j][1]=mod(a[j]-a[i-1]);
		}
	}
	for(int d=2;d<=m;d++)
		for(int i=1;i<=2*n;i++)
			for(int j=i+d-1;j<=2*n;j++)
				g[i][j][d]=INF;
	for(int d=2;d<=m;d++){
		for(int i=1;i<=2*n;i++){
			for(int j=i+d-1;j<=2*n;j++){
				for(int k=i+d-2;k<j;k++){
					f[i][j][d]=max(f[i][j][d],f[i][k][d-1]*mod(a[j]-a[k]));
					g[i][j][d]=min(g[i][j][d],g[i][k][d-1]*mod(a[j]-a[k]));
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		ans1=max(ans1,f[i][i+n-1][m]);
		ans2=min(ans2,g[i][i+n-1][m]);
	}
	cout<<ans2<<endl<<ans1;
}
posted @ 2020-06-23 20:34  _乀aakennes  阅读(91)  评论(0编辑  收藏  举报
levels of contents