记录编号 325852 评测结果 AAAAA
题目名称 [NOIP 2003]数字游戏 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.141 s
提交时间 2016-10-20 16:53:55 内存使用 3.88 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <queue>
using namespace std;
int data[104];
int dpmin[233][233][11];
int dpmax[233][233][11];
int sum[233];
#define MO(x) ((((x)%10)+10)%10)
int minv = 0x6666666;
int maxv = -0x43333333;
void dp(int s, int n, int m)
{
    sum[s-1] = 0;
    for(int i = s; i < s+n; i++)
    {
        sum[i] = sum[i-1] + data[i];
        sum[i] = MO(sum[i]);
    }
    for(int i = s; i < s+n; i++)
        for(int j = i; j < s+n; j++)
            dpmin[i][j][1] = dpmax[i][j][1] = MO(sum[j]-sum[i-1]);
    for(int len = 2; len <= n; len++)
    {
        for(int k = 2; k <= m; k++)
        {
            for(int i = s; i+len-1 < s+n; i++)
            {
                int j = i+len-1;
                dpmin[i][j][k] = 0x6666666;
                dpmax[i][j][k] = -0x43333333;
                for(int f = i; f < j; f++)
                {
                    dpmin[i][j][k] = min(dpmin[i][j][k], dpmin[i][f][k-1]*MO(sum[j]-sum[f]));
                    dpmax[i][j][k] = max(dpmax[i][j][k], dpmax[i][f][k-1]*MO(sum[j]-sum[f]));
                }
            }
        }
    }
    minv = min(minv, dpmin[s][s+n-1][m]);
    maxv = max(maxv, dpmax[s][s+n-1][m]);
}
int main()
{
    freopen("numgame.in", "r", stdin);
    freopen("numgame.out", "w", stdout);
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", data+i);
        data[i+n] = data[i];
    }
    for(int i = 1; i <= n; i++)
        dp(i, n, m);
    
    printf("%d %d\n", minv, maxv);
    return 0;
}