第一行:N
第2至N+1行:每行一个数,代表糖果数
一个数,请输出胜利者比失败者多拿多少糖果
4 1 55 41 2
15
小明先选择55,此时环从55处断开,变为序列[41, 2, 1]
小红选择行首的41,此时剩余的序列为[2, 1]
小明选择行首的2,此时剩余的序列为[1]
小红选择剩余的1。
此时小明胜利,比小红多15个糖果
n=int(input())nums=[]fori inrange(n):tmp=int(input())nums.append(tmp)defWin(num):n=len(num)dp=[[0]*n for_ inrange(n)]forl inrange(n):fori inrange(n-l):j=i+lifl<=1: dp[i][j]=max(num[i],num[j])else:dp[i][j]=max(min(dp[i+1][j-1],dp[i][j-2])+num[j],min(dp[i+2][j],dp[i+1][j-1])+num[i])return-sum(num)+2*dp[0][n-1]res=0fori inrange(n):index=inum=nums[index+1:]+nums[:index]res=max(res,nums[i]-Win(num))print(res)
#include <bits/stdc++.h>
using namespace std;
int F(int *a, int n){
int dp[n][n],s=0;
memset(dp,0,sizeof(0));
for(int k=0;k<n;k++){
for(int i=0;i<n-k;i++){
int j=i+k;
if(k<=1)
dp[i][j] = max(a[i], a[j]);
else
dp[i][j] = max(min(dp[i+1][j-1], dp[i][j-2])+a[j], min(dp[i+2][j], dp[i+1][j-1])+a[i]);
}
}
for(int i=0;i<n;i++)
s += a[i];
s = 2*dp[0][n-1]-s;
return s;
}
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int s = 0;
for(int i=0;i<n;i++){
int b[n-1],k=0;
for(int j=i+1;j<n;j++)
b[k++] = a[j];
for(int j=0;j<i;j++)
b[k++] = a[j];
s = max(s, a[i]-F(b, n-1));
}
cout<<s<<endl;
return 0;
} dic={}
def res(ary):
if not ary:
return 0
if not ary in dic:
dic[ary]=min(-res(ary[1:])-ary[0],-res(ary[:-1])-ary[-1])#对于对手来说,对手得分是负的自己得分
return dic[ary]
a=int(input())
aa=[int(input()) for _ in range(a)]
print (abs(max([-res(tuple(aa[i:]+aa[:i])) for i in range(a)])))
def PredictTheWinner(nums): n = len(nums) dp = [[0] * n for _ in range(n)] for i in range(n): dp[i][i] = nums[i] for a in range(1,n): for b in range(n-a): i = b j = b+a dp[i][j] = max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]) return dp[0][-1] nums = [] n = int(input()) for i in range(n): nums.append(int(input())) maxv = -1000000 for i in range(n): res = nums[i+1::]+nums[0:i] temp = nums[i]-PredictTheWinner(res) if temp>maxv: maxv = temp print(maxv)
import java.util.*;
// 环:复制一倍结尾, 枚举分割点, 取max
// DP[i][j]表示candy[i~j]中先手比后手多拿的糖果数
// 区间DP
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] candy = new int[n << 1];
for (int i = 0; i < n; i++) {
candy[i] = candy[i + n] = in.nextInt();
}
memo = new int[n << 1][n << 1];
for (int[] row : memo) Arrays.fill(row, -1);
int res = 0;
for (int i = 0; i < n; i++) { // [i, i+n-1]
res = Math.max(res, dfs(candy, i, i + n - 1)); // 最大
}
System.out.println(res);
}
static int[][] memo;
static int dfs(int[] candy, int i, int j) {
if (i == j) return candy[i];
if (memo[i][j] != -1) return memo[i][j];
return memo[i][j] = Math.max(candy[i] - dfs(candy, i + 1, j), candy[j] - dfs(candy, i, j - 1));
}
} (1758)#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> dp;
vector<int> nums;
int n;
int dfs(int st, int ed){
if(dp[st][ed] != -1) return dp[st][ed];
if(st == ed) return nums[st];
int x = nums[st] - dfs((st-1+n)%n, ed);
int y = nums[ed] - dfs(st, (ed+1)%n);
int cur;
cur = max(x, y);
return dp[st][ed] = cur;
}
int main(){
scanf("%d", &n);
nums = vector<int>(n);
for(int i=0; i<n; i++){
scanf("%d", &nums[i]);
}
dp = vector<vector<int>>(n, vector<int>(n, -1));
int maxn = 0;
for(int i=0; i<n; i++){
int cur = nums[i] - dfs((i-1+n)%n, (i+1)%n);
maxn = max(cur, maxn);
}
cout << maxn << endl;
return 0;
} import random
def d_candy(time,array):
xm,xh,arr = 0,0,[]
l_len = len(array)
xm = random.choice(array)
# 小明随机取第一盒糖果
for i in range(0,l_len):
if xm == array[i]:
if i == 0:
arr = array[1:]
elif i == l_len:
arr =array[0:l_len-2]
# 小明如在 [1,55,41,2,10,5,3]队首、队尾取的时候,进行的处理
else:
j = i
while j < (l_len -1):
j += 1
arr.append(array[j])
j = 0
while j < i:
arr.append(array[j])
j += 1
# 对形成的队列进行重新排序
l_len1 = len(arr)
k = 0
while l_len1 != 0:
if k%2 == 0:
r = random.choice([-1,0])
a = arr[r]
xh += a
del arr[r]
l_len1 -= 1
k += 1
else:
r = random.choice([-1,0])
b = arr[r]
xm += b
del arr[r]
l_len1 -= 1
k += 1
if (xm - xh) > 0:
print("小明获胜:")
return xm - xh
else :
print("小红获胜:")
return xh - xm
arry = []
m = int(input())
for i in range(m):
a = int(input())
arry.append(a)
print(d_candy(m,arry))
# 本地运行正常