zoukankan      html  css  js  c++  java
  • [动态规划] Sum游戏 ( Game of Sum, Uva 10891 )

    抓住状态转移方程即可   :  从子序列 i j 中取最大 =  i + 从子序列i+1,j中取最大        或         j +  从子序列i,j-1中取最大


    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    
    const int maxn = 100+10;
    int S[maxn], A[maxn], d[maxn][maxn], vis[maxn][maxn], n;
    
    int dp(int i, int j){
    	if (vis[i][j]) return d[i][j];
    	vis[i][j] = 1;
    	
    	if (i == j) {
    		d[i][j] = A[i];
    		return d[i][j];
    	}
    
    	d[i][j] = max(A[i] + S[i+1,j] - dp(i + 1,j), A[j] + S[i,j - 1] - dp(i,j - 1));
    	return d[i][j];
    }
    
    int main(){
    	while (scanf("%d", &n) && n){
    		S[0] = 0;
    		for (int i = 1; i <= n;i++)
    		{
    			scanf("%d", &A[i]);
    			S[i] = S[i - 1] + A[i];
    		}
    		memset(vis, 0, sizeof(vis));
    		printf("%d
    ", 2*dp(1, n)-S[n]);
    	}
    	return 0;
    }
    


  • 相关阅读:
    合并区间
    编译与运行
    传递信息
    划分字母区间
    无重叠区间
    用最少数量的箭引爆气球
    根据身高重建队列
    二叉树展开为链表
    动态添加按钮
    基础知识
  • 原文地址:https://www.cnblogs.com/Pomodori/p/4356951.html
Copyright © 2011-2022 走看看