SCU 2113 数字游戏

来源:互联网 发布:数据科学家养成手册 编辑:程序博客网 时间:2024/05/16 11:09

题目链接

题意:字面意思。。。

分析:把环断成链,然后dp,dp[i][j]表示把前i个数划分成j部分。转移方程dp[i][k]=max{dp[j][k-1]*(s[i]-s[j-1])}.枚举每种断链可能。

#include<cstdio>#include<algorithm>#include<cstring>#define MAX_N 55#define MAX_M 12#define inf 0x3f3f3f3f#define ten 1000000using namespace std;int n,m;int dp1[MAX_N][MAX_M];int dp2[MAX_N][MAX_M];int sum[MAX_N*2];int mod(int x){    return (x+ten)%10;}int main(void){    while(scanf("%d%d",&n,&m)==2)    {        fill(sum,sum+n+1,0);        for(int i=1;i<=n;i++)        {            int a;            scanf("%d",&a);            sum[i]=sum[i-1]+a;        }        for(int i=n+1;i<2*n;i++)        sum[i]=sum[n]+sum[i-n];        int ans1=inf;        int ans2=-inf;        for(int s=1;s<=n;s++)        {            for(int i=1;i<=n;i++)            dp1[i][1]=dp2[i][1]=mod(sum[s+i-1]-sum[s-1]);            for(int k=2;k<=m;k++)            {                for(int i=k;i<=n;i++)                {                    dp1[i][k]=inf;                    dp2[i][k]=-inf;                    for(int j=k-1;j<i;j++)                    {                        dp1[i][k]=min(dp1[i][k],dp1[j][k-1]*mod(sum[s-1+i]-sum[s-1+j]));                        dp2[i][k]=max(dp2[i][k],dp2[j][k-1]*mod(sum[s-1+i]-sum[s-1+j]));                    }                }            }            ans1=min(ans1,dp1[n][m]);            ans2=max(ans2,dp2[n][m]);        }        printf("%d\n%d\n",ans1,ans2);    }    return 0;}
0 0
原创粉丝点击