• SSL 1028——数字游戏


    Description

      丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
      例如,对于下面这圈数字(n=4,m=2):

    这里写图片描述

      当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。
    丁丁请你编写程序帮他赢得这个游戏。

    Input

    输入第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。

    Output

    输出有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。

    Sample Input

    4 2
    4
    3
    -1
    2
    Sample Output

    7
    81


    这道题是典型的环形DP,我们设f[i][j]为前i个数分成j份得到的最大值,g[i][j]表示前i个数分成j份获得的最小值。于是状态转移方程很容易推出来:
    f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
    g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
    我们枚举一个k端点在1~i-1之间,表示这k个数分成j-1份之后剩下的k+1到i分成一份,所获得的价值用前缀和处理即可。
    (注意要%10)


    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=205;
    int Min,Max,n,sum[maxn],num[maxn],f[maxn][15],g[maxn][15],m;
    void DP(int a[]){
        for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
        for(int i=0;i<=n;i++)
          for(int j=0;j<=m;j++)
            f[i][j]=0,g[i][j]=0x5f;
        for(int i=1;i<=n;i++)
          f[i][1]=g[i][1]=(sum[i]%10+10)%10;
        for(int j=2;j<=m;j++)
          for(int i=j;i<=n;i++)
            for(int k=j-1;k<=i-1;k++)
            {
                f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
                g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
            }
        Min=min(Min,g[n][m]);
        Max=max(Max,f[n][m]);
    }
    int main()
    {
        Min=0x5f;Max=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
            num[i+n]=num[i];
        }
        for(int i=0;i<n;i++)
          DP(num+i);
        printf("%d
    %d",Min,Max);
        return 0;
    }
  • 相关阅读:
    DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)
    C3P0数据库连接池使用
    POJ
    【jQuery】复选框的全选、反选,推断哪些复选框被选中
    BestCoder Round #75 King&#39;s Cake 模拟&amp;&amp;优化 || gcd
    《Javascript_Dom 编程艺术》(第2版)读书笔记
    POJ 2947-Widget Factory(高斯消元解同余方程式)
    MFC 小知识总结四
    迭代器和iter()函数
    hdu1595find the longest of the shortest 最短路
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412302.html
Copyright © 2020-2023  润新知