UVA11489 - Integer Game

本文详细解析了UVA 11663题目的解决方案,采用动态规划和博弈论相结合的方法,通过状态表示模3的余数为0,1,2的数字剩余数量,探讨了在特定条件下玩家是否能必胜的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2484

题解

f ( i , j , k ) f(i,j,k) f(i,j,k)表示模 3 3 3的余数为 0 , 1 , 2 0,1,2 0,1,2的数字分别剩下 i , j , k i,j,k i,j,k个的时候,是否必胜
然后 d p dp dp转移下就好了
这样看似时空复杂度会炸掉,实则不会,因为 i + j + k ≤ 1000 i+j+k \leq 1000 i+j+k1000,因此当 i = j = k = 33 i=j=k=33 i=j=k=33的时候 i j k ijk ijk才会取到最大值 35937 35937 35937,即使我每次都 d p dp dp也不会超时,空间的问题找 m a p map map来解决下就好了

代码

//博弈论、DP
#include <bits/stdc++.h>
#define ll long long
#define v(a,b,c) (a*1002001ll+b*1001ll+c)
using namespace std;
map<ll,bool> f;
bool dfs(ll a, ll b, ll c)
{
	if(a==0 and b==0 and c==0)return 0;
	if(f.find(v(a,b,c))!=f.end())return f[v(a,b,c)];
	bool ans=0;
	if(a>0 and !dfs(a-1,b,c))ans=1;
	if(b>0 and (b+2)%3==c%3 and !dfs(a,b-1,c))ans=1;
	if(c>0 and b%3==(c+2)%3 and !dfs(a,b,c-1))ans=1;
	f[v(a,b,c)]=ans;
	return ans;
}
char s[10000];
ll N;
int main()
{
	ll i, c[3], kase, T, len;
	scanf("%lld",&T);
	for(kase=1;kase<=T;kase++)
	{
		printf("Case %lld: ",kase);
		scanf("%s",s+1), len=strlen(s+1);
		c[0]=c[1]=c[2]=0; 
		for(i=1;i<=len;i++)c[(s[i]-48)%3]++;
		if(dfs(c[0],c[1],c[2]))printf("S\n");
		else printf("T\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值