zoukankan      html  css  js  c++  java
  • UVa 10891 Game of Sum (DP)

    题意:给定一个长度为n的整数序列,两个人轮流从左端或者右端拿数,A先取,问最后A的得分-B的得分的结果。

    析:dp[i][j] 表示序列 i~j 时先手得分的最大值,然后两种决策,要么从左端拿,要么从右端拿,肯定是拿的是最大的。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    #include <unordered_map>
    #include <unordered_set>
    #define debug() puts("++++");
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    
    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 100 + 5;
    const int mod = 1e9 + 7;
    const int dr[] = {-1, 1, 0, 0};
    const int dc[] = {0, 0, 1, -1};
    const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    }
    int dp[maxn][maxn], sum[maxn], a[maxn];
    int f[maxn][maxn], g[maxn][maxn];
    
    int main(){
        while(scanf("%d", &n) == 1 && n){
            for(int i = 1; i <= n; ++i)  scanf("%d", a+i);
            sum[0] = 0;
            for(int i = 1; i <= n; ++i){
                f[i][i] = g[i][i] = dp[i][i]  = a[i];
                sum[i] = sum[i-1] + a[i];
            }
            for(int l = 1; l < n; ++l)
                for(int i = 1; i+l <= n; ++i){
                    int j = i + l;
                    int mmin = 0;
                    mmin = min(mmin, f[i+1][j]);
                    mmin = min(mmin, g[i][j-1]);
                    dp[i][j] = sum[j] - sum[i-1] - mmin;
                    f[i][j] = min(dp[i][j], f[i+1][j]);
                    g[i][j] = min(dp[i][j], g[i][j-1]);
                }
            printf("%d
    ", 2*dp[1][n] - sum[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/6529808.html
Copyright © 2011-2022 走看看