您的位置:首页 > 其它

【USACO3.3.5】一个游戏

2015-04-07 21:23 323 查看
程序里有解释

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int n;
int a[105], s[105]={0};
int f[105][105];

/*
f[i][j] 面对[i,j]的区间, 所能取得的最大值 显然后面对的,能取得的值就是s[j]-s[i - 1] - f[i][j]

f[i][j] 过后肯定是 f[i +1][j] f[i][j - 1]的局势

所以f[i][j] = max(s[j] - s[i] - f[i + 1][j] + a[i], s[j - 1] - s[i - 1] - f[i][j - 1] + a[j]);
f[i][i] = a[i]

*/

int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
{
scanf("%d", &a[i]);
s[i] = s[i-1] + a[i];
f[i][i] = a[i];
}
for (int k = 1; k != n ; ++ k)
for (int i = 1; i + k <= n; ++ i)
{
int j = i + k;
f[i][j] = max(s[j] - s[i] - f[i + 1][j] + a[i], s[j - 1] - s[i - 1] - f[i][j - 1] + a[j]);
}
printf("%d %d\n", f[1]
, s
- f[1]
);
return 0;
}
/*
6
4 7 2 9 5 2
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: