CodeVS1085 数字游戏

来源:互联网 发布:bit.edu.cn域名 编辑:程序博客网 时间:2024/06/03 18:07

链接:http://codevs.cn/problem/1085/

【题解】

  zzy大神刚刚推荐我做这道水题,然后我就做了,发现其实这道题还不错

  你就划分DP就好了呀。。枚举最后一个区间的左端点。。然后转移就好了啦

【代码】

#include <cstdio>#include <algorithm>#include <cstring>#define maxn 200#define inf 0x3f3f3f3fusing 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;}


0 0
原创粉丝点击