记录编号 |
325852 |
评测结果 |
AAAAA |
题目名称 |
[NOIP 2003]数字游戏 |
最终得分 |
100 |
用户昵称 |
sxysxy |
是否通过 |
通过 |
代码语言 |
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;
}