• lightoj 1031(dp)


    题意:一排数字两个人轮流从两边拿,都采用最优策略。问先手最多能拿到多少个。

    思路:dp[i][j]表示先手在i-j中最多能拿到的数字之和,然后从小到大枚举区间

    状态转移:

    dp[j][i+j] = max(dp[j][i+j], sum[k-1] - sum[j-1] - dp[k][i+j]);
    dp[j][i+j] = max(dp[j][i+j], sum[i+j] - sum[k] - dp[j][k]);

    代码如下:

     1 /**************************************************
     2  * Author     : xiaohao Z
     3  * Blog     : http://www.cnblogs.com/shu-xiaohao/
     4  * Last modified : 2014-05-06 11:34
     5  * Filename     : L_1031.cpp
     6  * Description     : 
     7  * ************************************************/
     8  #include <iostream>
     9 #include <cstdio>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <cmath>
    13 #include <algorithm>
    14 #include <queue>
    15 #include <stack>
    16 #include <vector>
    17 #include <set>
    18 #include <map>
    19 #define MP(a, b) make_pair(a, b)
    20 #define PB(a) push_back(a)
    21 
    22 using namespace std;
    23 typedef long long ll;
    24 typedef pair<int, int> pii;
    25 typedef pair<unsigned int,unsigned int> puu;
    26 typedef pair<int, double> pid;
    27 typedef pair<ll, int> pli;
    28 typedef pair<int, ll> pil;
    29 
    30 const int INF = 0x3f3f3f3f;
    31 const double eps = 1E-6;
    32 const int LEN = 101;
    33 int n, dp[LEN][LEN], num[LEN], sum[LEN];
    34 
    35 int main()
    36 {
    37     freopen("in.txt", "r", stdin);
    38 
    39     int T, kase = 1;
    40     cin >> T;
    41     while(T--){
    42         cin >> n;
    43         for(int i=1; i<=n; i++)
    44             cin >> num[i];
    45         sum[0] = 0;
    46         for(int i=1; i<=n; i++) sum[i] = sum[i-1] + num[i];
    47         for(int i=0; i<n; i++){
    48             for(int j=1; j+i<=n; j++){
    49                 dp[j][i+j] = sum[i+j] - sum[j-1];
    50                 for(int k=j; k<=j+i; k++){
    51                     if(k!=j)
    52                         dp[j][i+j] = max(dp[j][i+j], sum[k-1] - sum[j-1] - dp[k][i+j]);
    53                     if(k!=i+j)
    54                         dp[j][i+j] = max(dp[j][i+j], sum[i+j] - sum[k] - dp[j][k]);
    55                 }
    56             }
    57         }
    58         cout << "Case " << kase++ << ": " << dp[1][n] << endl;
    59     }
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    nginx反向代理前后端分离项目(后端多台)
    部署http访问SVN模式出现403问题
    The server quit without updating PID file
    guns开源项目数据库切换为oracle
    window环境下修改postgrep密码
    mybatis中怎样使用having?
    PostgreSQL时间段查询
    Java实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
    Jenkins构建maven项目跳过测试用例的命令
    supervisord
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3711279.html
Copyright © 2020-2023  润新知