hdu6199(此题是搜索但是阔以改成dp的)

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int mod = 255;
int dp[255][255];
int sum[20014];
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n); int limit = (int)sqrt(2 * n) + 1;
		sum[0] = 0;
		for (int i = 1; i <= n; i++)
		{
			scanf("%d", &sum[i]);
			//sum[i] = 100000;
			sum[i] += sum[i - 1];
		}
		dp[1][2] = -2100000000; dp[1][1] = -2100000000;
		for (int i = n; i >=1; i--)
		{
			for (int j = limit; j>=1; j--)
			{
				if (i - 1 + j <=n)
				{
					dp[i&mod][j] = sum[i - 1+j] - sum[i - 1];
					int res=0;
					if (i + j + j - 1 <= n)res= dp[(i + j)&mod][j];
					if (i + j + j <= n)res = max(res, dp[(i + j)&mod][j + 1]);//因为对手是不会让你好过的所以真实情况必须减最大
					dp[i&mod][j] -= res;
				}
				//printf("%d %d\n", i, j);
			}
			
		}
		printf("%d\n", max(dp[1][1], dp[1][2]));
	}
	return 0;
}

其实就是一个对抗搜索的裸体,对抗搜索你只能从后往前因为后面最坏的才是真实的,前面状态再好,对现在是木有影响的,对手是不会让你好过的。嘿嘿。。。

然后注意k的范围。

注意 注意优化空间

然后就是从后往前dp

哦,还有对抗搜索的显著特征就是那个人让局面最小,另一个人让局面最大,其实让局面最小的那个人只是相对于对手的,就是想让对手的得分最少,那么相当于自己得分最多

对于这题,bob想让局面差最小其实就是想让自己得分最大,因为当差值是负数的时候,如果用bob-alice不就是正么。。。

如果此题改成bob想得分最少,alice想得分最多,那么就是一个dp而不是对抗搜索了,这样相当于就是求最大差值了,这就是一个完完全全的dp了。(我木有告诉你我原来就是这样理解的?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值