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; }
相关文章推荐
- Sicily 1176. Two Ends
- sicily 1176 Two Ends
- sicily 1176 two ends 动态规划解题
- Sicily 1176. Two Ends
- sicily 1176 Two Ends
- [Sicily 1176 Two Ends] 动态规划 记忆化搜索
- sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)
- Sicily 1176. Two Ends
- sicily 1176 Two ends
- sicily 1176. Two Ends
- Sicily 1176 Two Ends
- Sicily 1176 Two Ends
- sicily 1176.Two ends
- [sicily]1176. Two Ends
- sicily 1176 two ends
- sicily 1176. Two Ends
- sicily 1176 Two Ends dp(记忆化搜索)
- Sicily 1008 two ends
- sicily 1176
- Sicily1176