这道题是一道博弈论的题目
判断方案是否可行,可以使用动态规划
这是动态规划中,表示这个方案是否可行了
我先把公式亮一下
f[i]表示呢,当前的数字为i时,先手是否能赢
因为操作了一次,所以只有对两个子问题取反后再取或,才能更新答案
至于求这个数字中最大和最小值应该不用细讲了吧
看代码吧
#include<bits/stdc++.h>
using namespace std;
int n;
int f[1000001];
int mi(int x)
{
int ans=INT_MAX;
while(x!=0)
{
if(x%10<ans&&x%10!=0) ans=x%10;
x/=10;
}
return ans;
}//求小
int mx(int x)
{
int ans=INT_MIN;
while(x!=0)
{
if(x%10>ans) ans=x%10;
x/=10;
}
return ans;
}//求大
int main()
{
cin>>n;
while(n--)
{
memset(f,0,sizeof(f));
int x;
cin>>x;
for(int i=1;i<=9;i++) f[i]=1;//每一个个位数字,只要已减,就是0,所以说先手必胜,设成1
for(int i=1;i<=x;i++)
{
int minn=mi(i);
int maxx=mx(i);
f[i]=(!f[i-minn])|(!f[i-maxx]);
}
if(f[x]==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}