您的位置:首页 > 其它

USACO 3.3.5

2010-08-17 15:18 162 查看
博弈问题,可以使用dp解决.

f[i][j] =
s[i][j] - min{f[i+1][j], f[i][j-1]}

s[i][j]表示从i加到j的和,
枚举l=j-i.

Executing...

Test
1: TEST OK [0.011 secs, 3108 KB]

Test
2: TEST OK [0.011 secs, 3108 KB]

Test
3: TEST OK [0.011 secs, 3108 KB]

Test
4: TEST OK [0.011 secs, 3108 KB]

Test
5: TEST OK [0.011 secs, 3108 KB]

Test
6: TEST OK [0.011 secs, 3108 KB]

Test
7: TEST OK [0.000 secs, 3108 KB]

Test
8: TEST OK [0.000 secs, 3108 KB]

Test
9: TEST OK [0.000 secs, 3108 KB]

Test
10: TEST OK [0.000 secs, 3108 KB]

Test
11: TEST OK [0.011 secs, 3108 KB]

Test
12: TEST OK [0.011 secs, 3108 KB]

Test
13: TEST OK [0.000 secs, 3108 KB]

Test
14: TEST OK [0.000 secs, 3108 KB]

Test
15: TEST OK [0.011 secs, 3108 KB]

Test
16: TEST OK [0.000 secs, 3108 KB]

All tests OK.

YOUR PROGRAM
('game1') WORKED FIRST TIME!
That's fantastic -- and a rare thing.
Please accept these special automated congratulations.

[Code]

#include<stdio.h>
#include<iostream>
using namespace std;
const int MAXN = 100+10;
int N[MAXN], f[MAXN][MAXN] = {0}, s[MAXN][MAXN] = {0}, sum[MAXN] = {0};
int min(int x, int y) {return (x < y) ? x : y;}
int main()
{
FILE *fin, *fout;
fin    = fopen("game1.in", "r");
fout = fopen("game1.out", "w");
int n=0, i, j, l;
fscanf(fin, "%d", &n);
for (i = 1; i <= n; i++) fscanf(fin, "%d", &N[i]);
for (i = 1; i <= n; i++)
{
s[i][i] = N[i];
for (j = i+1; j <= n; j++)
s[i][j] = s[i][j-1] + N[j];
}
for (i = 1; i <= n; i++) f[i][i] = N[i];
for (l = 1; l < n; l++)
for (i = 1; i <= n-l; i++)
f[i][i+l] = s[i][i+l] - min(f[i+1][i+l], f[i][i+l-1]);
fprintf(fout, "%d %d/n", f[1]
, s[1]
-f[1]
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: