题意比较简单,两个人拿偶数张卡片,要么拿当前的最左边,要么拿最右边,尽量拿大的,拿完后求第一个人拿的卡片数字总和减去第二个人卡片的数字总和,求最大差值。
刚开始写记忆化搜索,参考了一下别人的代码,但是还有一个地方不太明白,就是当第一个人拿右边的时候,为什么写成num[x]<=num[y-1]会wa(⊙o⊙)…
求指教额。。。
#include <iostream> #include<stdio.h> #include<algorithm> #include<string> #include<cstring> #include<cmath> #define N 1100 using namespace std; int num[N]; int dp[N][N]; int dfs(int x,int y) { int a,b; if(dp[x][y]!=-1) return dp[x][y]; if(x==y-1) return dp[x][y]=abs(num[x]-num[y]); if(num[x+1]>=num[y])//如果第一个人选左边,则比较左边第二个和最后一个大小,大的则为第二个人的选择,求出差值 a=dfs(x+2,y)+num[x]-num[x+1]; else a=dfs(x+1,y-1)+num[x]-num[y]; if(num[x]<num[y-1])//同理,如果第一个人选择右边 b=dfs(x,y-2)+num[y]-num[y-1]; else b=dfs(x+1,y-1)+num[y]-num[x]; return dp[x][y]=max(a,b); } int main() { int n; int ca=1; while(~scanf("%d",&n)) { if(n==0) break; for(int i=1;i<=n;i++) scanf("%d",&num[i]); memset(dp,-1,sizeof dp); printf("In game %d, the greedy strategy might lose by as many as %d points.\n",ca++,dfs(1,n)); } return 0; }
POJ 2738 Two Ends 记忆化搜索
时间: 2024-10-09 09:24:29