#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
int save[1000],n,m;
ll sum[1000];
ll dp[120][120][20],dp2[120][120][20];
ll dfs(int l,int r,int k)
{
//printf("%d %d %d\n",l,r,k);
// system("pause");
if(dp[l][r][k]!=-1000000ll) return dp[l][r][k];
for(int i=l;i<r;i++)
{
for(int j=1;j<k;j++)
{
if( i-l+1<=j ||r-i+1<= k-j ) continue;
dp[l][r][k]=max(dp[l][r][k],dfs(l,i,j)*dfs(i+1,r,k-j));
}
}
return dp[l][r][k];
}
ll dfs2(int l,int r,int k)
{
//printf("%d %d %d\n",l,r,k);
// system("pause");
if(dp2[l][r][k]!=1000000ll) return dp2[l][r][k];
for(int i=l;i<r;i++)
{
for(int j=1;j<k;j++)
{
if( i-l+1<=j ||r-i+1<= k-j ) continue;
dp2[l][r][k]=min(dp2[l][r][k],dfs2(l,i,j)*dfs2(i+1,r,k-j));
}
}
return dp2[l][r][k];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=2*n;i++)
{
for(int j=1;j<=2*n;j++)
{
for(int k=1;k<=m;k++)
{
dp[i][j][k]=-1000000;
dp2[i][j][k]=1000000;
}
}
}
for(int i=1;i<=n;i++)
{
scanf("%d",&save[i]);
save[i+n]=save[i];
}
for(int i=1;i<=2*n;i++)
sum[i]=save[i]+sum[i-1];
for(int i=1;i<=2*n;i++)
{
for(int j=i;j<=n+i-1;j++)
{
dp[i][j][1]=((sum[j]-sum[i-1])%10+10)%10;
dp2[i][j][1]=dp[i][j][1];
}
}
ll ans1=0;
ll ans2=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n;i++)
{
ans2=min(ans2,dfs2(i,n+i-1,m));
}
printf("%lld\n",ans2);
for(int i=1;i<=n;i++)
{
ans1=max(ans1,dfs(i,n+i-1,m));
}
printf("%lld\n",ans1);
return 0;
}
voj1218 环形dp 记忆化搜索
最新推荐文章于 2024-04-21 19:25:17 发布