您的位置:首页 > 其它

Sicily 1176. Two Ends

2013-01-03 19:38 337 查看
/*
两头取数,玩家2固定使用贪心法,玩家1要想办法获取最高分
牵扯到动态规划
存储所有可能的运算结果:
如果x+1 == y则:(x,y) = MAX(list[x], list[y])
否则:(x,y)=MAX[(x,y-2), (x+1,y-1), (x+2,y)],事实上也就是选择两种选择的高者
*/
/*
Run Time: 0.02secs
Run Memory: 4232KB
*/

#include <iostream>
#include <memory.h>

using namespace std;

int list[1001];                     //存储输入的数字串
int sum;                            //该数字串的总和
int results[1001][1001];

//计算最大分差的方法,使用动态规划
int df(int left, int right){
int max = 0;
if(results[left][right] == 0){ //避免重复计算
if(left+1 == right){       //当只有两个数的时候,肯定拿最大的那个
if(list[left] > list[right])
max = list[left];
else
max = list[right];
}else{
//如果取左边的数
int leftNum = list[left];
if(list[left+1] >= list[right])
leftNum += df(left+2, right);
else
leftNum += df(left+1, right-1);

//如果取右边的数
int rightNum = list[right];
if(list[left] >= list[right-1])
rightNum += df(left+1, right-1);
else
rightNum += df(left, right-2);

//左右两种方案获取最大值
if(leftNum > rightNum)
max = leftNum;
else
max = rightNum;
}
results[left][right] = max;    //推算最大值之后将其放入适当位置
}
return results[left][right];     //这里别return max...
}

int compute(int N){
int largest = df(0, N-1);
int diff = largest - (sum - largest);
return diff;
}

int main()
{
int num = 1;
int N;
cin >> N;
while (N > 0){
memset(list, 0, sizeof(list));
memset(results, 0, sizeof(results));
sum = 0;

for(int i=0; i<N; i++){
cin >> list[i];
sum += list[i];
}
int diff = compute(N);

cout << "In game " << num << ", the greedy strategy might lose by as many as " << diff << " points." << endl;
cin >> N;
num++;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: