1. 程式人生 > >BZOJ1783: [Usaco2010 Jan]Taking Turns

BZOJ1783: [Usaco2010 Jan]Taking Turns

ret spa mes ++ can view include pan span

n<=700000個數,兩人輪流取數,位置必須單增,輸出兩人都按最優策略得到的最大答案。

一開始看不懂“最優策略”,後來發現沒有必要知道,f[i][1/0]--先/後手取數i最優答案,f[i][1]=a[i]+f[maxi][0],f[i][0]=f[maxi][1],maxi>i,因為先手取完後手必定轉移到後面最優的先手策略。

然後WA了一發。這兩人還是挺友好的不會陷害對方,就是說,有多個f[maxi][1]時,去下標最小的一個,讓遊戲進行地更持久!

技術分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4
#include<math.h> 5 //#include<iostream> 6 using namespace std; 7 8 int n; 9 #define maxn 700011 10 #define LL long long 11 LL a[maxn],f[maxn][2]; 12 int main() 13 { 14 scanf("%d",&n); 15 for (int i=1;i<=n;i++) scanf("%lld",&a[i]); 16 f[n][1]=a[n];f[n][0]=0;int maxi=n;
17 for (int i=n-1;i>=1;i--) 18 { 19 f[i][1]=a[i]+f[maxi][0]; 20 f[i][0]=f[maxi][1]; 21 if (f[i][1]>=f[maxi][1]) maxi=i; 22 } 23 printf("%lld %lld\n",f[maxi][1],f[maxi][0]); 24 return 0; 25 }
View Code

BZOJ1783: [Usaco2010 Jan]Taking Turns