题意:给一串数字,每次可以取最左或最右,greedy strategy指从最左和最右当中选取较大的数字取走,取走的数字加成分数,问在最优情况下,greedy strategy会丢掉多少分数。
AC代码:
#include<bits/stdc++.h>
using namespace std;
//设对手使用 greedy strategy
int dp[1007][1007]; //对手greedy取法下l到r之间的最大差值
int s[1007];
int dfs(int l,int r){ //搜索
int sl,sr;
if(dp[l][r]!=0) return dp[l][r];
if(r==l+1) return abs(s[r]-s[l]);
if(s[l+1]>=s[r]){ //设先手取走s[l]的情况下,对手的取法
sl=dfs(l+2,r)+s[l]-s[l+1]; //前一状态为dp[l+2][r],取走s[l],对手取走s[l+1]
}
else sl=dfs(l+1,r-1)+s[l]-s[r];
if(s[r-1]>s[l]){//同理,先手取走s[r]的情况下对手的取法
sr=dfs(l,r-2)+s[r]-s[r-1];
}
else sr=dfs(l+1,r-1)+s[r]-s[l];
return dp[l][r]=max(sr,sl);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
int m=0;
while(cin>>n && n){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
cin>>s[i];
}
/* long long sum=0;
for(int i=1;i<=n/2;i++){
sum+=max(s[i],s[n-i+1]);
}*/
long long ans=dfs(1,n);
cout<<"In game "<<++m<<", the greedy strategy might lose by as many as "<<ans<<" points."<<endl;
}
return 0;
}
那么鬼故事来了
AC代码片段:
if(s[r-1]>s[l]){//同理,先手取走s[r]的情况下对手的取法
sr=dfs(l,r-2)+s[r]-s[r-1];
}
else sr=dfs(l+1,r-1)+s[r]-s[l];
WA代码片段:
if(s[r-1]>=s[l]){//同理,先手取走s[r]的情况下对手的取法
sr=dfs(l,r-2)+s[r]-s[r-1];
}
else sr=dfs(l+1,r-1)+s[r]-s[l];
暂时没弄懂为啥会wa在test2= =