链接:http://codevs.cn/problem/1085/
【题解】
zzy大神刚刚推荐我做这道水题,然后我就做了,发现其实这道题还不错
你就划分DP就好了呀。。枚举最后一个区间的左端点。。然后转移就好了啦
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 200
#define inf 0x3f3f3f3f
using namespace std;
int f[maxn][maxn][15], n, m, a[maxn], s[maxn];
int main()
{
int i, j, k, len, parts, ans=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",a+i),a[i+n]=a[i];
for(i=1;i<=n<<1;i++)s[i]=s[i-1]+a[i];
for(i=1;i<=n<<1;i++)for(j=i;j<=n<<1;j++)f[i][j][1]=(s[j]-s[i-1]+100000000)%10;
for(k=2;k<=m;k++)
for(len=k;len<=n;len++)
for(i=1;i<=n;i++)
{
f[i][i+len-1][k]=inf;
for(j=i+(k-1)-1;j<i+len-1;j++)
f[i][i+len-1][k]=min(f[i][i+len-1][k],f[i][j][k-1]*f[j+1][i+len-1][1]);
}
ans=inf;for(i=1;i<=n;i++)ans=min(ans,f[i][i+n-1][m]);
printf("%d\n",ans);
for(k=2;k<=m;k++)
for(len=k;len<=n;len++)
for(i=1;i<=n;i++)
for(j=i;j<i+len-1;j++)
f[i][i+len-1][k]=max(f[i][i+len-1][k],f[i][j][k-1]*f[j+1][i+len-1][1]);
ans=0;for(i=1;i<=n;i++)ans=max(ans,f[i][i+n-1][m]);
printf("%d\n",ans);
return 0;
}