C++版本的题解

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200
#define maxint 1000000000
using namespace std;
int n,m;
int a[maxn],sum[maxn],f[maxn][maxn];//f[i][j]表示前i为分为j组的最值
void read(){
scanf("%d%d",&n,&m);
int i;
sum[0]=0;
for(i=1;i<=n;i++)
{scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];}
for(i=n+1;i<=2*n;i++)
{a[i]=a[i-n];
sum[i]=sum[i-1]+a[i];
}
a[2*n+1]=a[1];
sum[2*n+1]=sum[2*n]+a[1];
}
void DP(){
int head,i,j,k,ansmin=maxint,ansmax=-maxint;

for(head=1;head<=n;head++)
{ memset(f,0x3f3f3f,sizeof(f));
for(i=head;i<=head+n-1;i++)
f[i][1]=((sum[i]-sum[head-1])%10+10)%10;
for(i=head+1;i<=head+n-1;i++)
{for(j=2;j<=min(m,i-head+1);j++)
for(k=j+head-2;k<=i-1;k++)
f[i][j]=min(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
}
ansmin=min(ansmin,f[head+n-1][m]);
}
cout<<ansmin<<endl;

for(head=1;head<=n;head++)
{ memset(f,-0x3f3f,sizeof(f));
for(i=head;i<=head+n-1;i++)
f[i][1]=((sum[i]-sum[head-1])%10+10)%10;
for(i=head+1;i<=head+n-1;i++)
{for(j=2;j<=min(m,i-head+1);j++)
{ for(k=j+head-2;k<i;k++)
f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
}
}
ansmax=max(ansmax,f[head+n-1][m]);
}
cout<<ansmax<<endl;
}
int main(){
read();
DP();
return 0;
}

2 条评论

  • 1

信息

ID
1218
难度
5
分类
动态规划 | 环形DP 点击显示
标签
递交数
2837
已通过
1084
通过率
38%
被复制
18
上传者