您的位置:首页 > 其它

hdu4597play games【记忆化搜索】

2015-12-22 11:43 246 查看
继续作死就是不想写C#大作业 嘤嘤嘤 继虚拟机安不上、数据库连不上、网不好使之后,居然codeblocks都罢工==

这是一个长得像博弈的记忆化搜索(当然有人说是用博弈写的,代码居然还是这;还有人用区间dp写的 ,等学到那里再说)开始我就各种纠结怎么表示、怎么递归状态啊 。二呵呵的写了两个函数分别调用表示两个人依次取数的过程,仨人还得写仨函数呗→_→既然每个人都默认是聪明的,那么他俩每步取得过程都是按当前最优!几个人都是一样的!

Dp值表示剩下这些数里能取的最大值,继续的讲解我再想……估计今天又不想写大作业了

/******
hdu4597
2015.12.20-12.21
93MS 4892K 1240 B C++
*****/
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int sum,t,n,num1[30],num2[30],dp[30][30][30][30];
int dfs(int la,int ra,int lb,int rb,int sum)
{
if(dp[la][ra][lb][rb]) return dp[la][ra][lb][rb];
if(la>ra&&lb>rb) return 0;
int maxn=0;
if(la<=ra)
{
maxn=max(maxn,sum-dfs(la+1,ra,lb,rb,sum-num1[la]));
maxn=max(maxn,sum-dfs(la,ra-1,lb,rb,sum-num1[ra]));
}
if(lb<=rb)
{
maxn=max(maxn,sum-dfs(la,ra,lb+1,rb,sum-num2[lb]));
maxn=max(maxn,sum-dfs(la,ra,lb,rb-1,sum-num2[rb]));
}
dp[la][ra][lb][rb]=maxn;
return maxn;
}
int main()
{
// freopen("cin.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num1[i]);
sum+=num1[i];
}
for(int i=1;i<=n;i++)
{
scanf("%d",&num2[i]);
sum+=num2[i];
}
memset(dp,0,sizeof(dp));
dfs(1,n,1,n,sum);
printf("%d\n",dp[1]
[1]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: