洛谷 P2734 游戏 A Game
题意
给出长为n的序列,有两个人,轮流拿最左边或最右边的,且两个人的拿法的是最优的,写一个程序,判断第一个人和第二个人分别能拿到的的最大值。
做法
这道题的内存足够大,我们可以用动态规划,数组f [ i ] [ j ]表示从i到j这一段序列先手的比后手的多拿多少分。因为只能拿最右边的和最左边的,所以只要递推这两种情况后取最大值即可。
代码
#include<bits/stdc++.h> using namespace std; int n; int a[205]; int f[205][205];//f[i][j]表示从 i 到 j 这段序列先手比后手大的值 int main() { freopen("game1.in","r",stdin); freopen("game1.out","w",stdout); scanf("%d",&n); int s = 0; for(int i=1;i<=n;++i) scanf("%d",&a[i]), f[i][i] = a[i], s+=a[i];//记录 for(int l=2;l<=n;++l) { for(int i=1;i+l-1<=n;++i) { int j = i+l-1; f[i][j] = max(a[i]-f[i+1][j], a[j]-f[i][j-1]);//递推,求最大值 } } printf("%d %d\n", (s+f[1][n])/2, (s-f[1][n])/2);//两个人的值 return 0; }
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号