Sicily 1176. Two Ends

31 篇文章 0 订阅
/*
两头取数,玩家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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值