【UVA】10404-Bachet's Game(动态规划)

如果d[i]是必胜态,那么d[i + V[j]]一定是必败态,反之亦然。

用d[i]代表棋子为i个是否为必胜态。

边界条件是d[i] = 1;

14139291 10404 Bachet‘s Game Accepted C++ 0.662 2014-09-03 09:44:48

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define esp 1e-9
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================*/
#define MAX_SIZE 1000000 + 10
#define INF (1 << 20)
const int MAXD = 10 + 5;
int dp[MAX_SIZE];
int main(){
    int T;
    int arr[MAXD];
    while(scanf("%d",&T) != EOF){
        memset(dp,0,(T + 1)*sizeof(dp[0]));
        int n;
        scanf("%d",&n);
        for(int i = 0 ; i < n ; i++)
            scanf("%d",&arr[i]);
        dp[1] = 1;
        for(int i = 0 ; i <= T ; i++)
            for(int j = 0 ; j < n ; j++)
                if(i + arr[j] <= T && !dp[i]){
                     dp[i + arr[j]] = 1;
                }
        if(dp[T])
            printf("Stan wins\n");
        else
            printf("Ollie wins\n");
    }
    return 0;
}

【UVA】10404-Bachet's Game(动态规划)

时间: 2024-10-29 19:05:32

【UVA】10404-Bachet's Game(动态规划)的相关文章

UVa 10404. Bachet&#39;s Game

题意为给出总石子数n,和m堆石子,两个人轮着取石子,每次只能从总石子中取m堆中的一堆的个数的石子,取走最后一个石子的胜.S先取,O后取. 用博弈的输赢观念+dp就可以了,由于记忆化搜索会爆栈,那就递推了,索性还好推-- 不然就不会了-- #include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib&g

UVa 10404 Bachet&#39;s Game(DP)

题意   给你n个小石头  和一个数组a[m]   然后两个人轮流取石头  stan先取  olive后取  他们都完美发挥    谁取完最后一个石头谁就是赢家    感觉不是很容易看出来是dp题  令d[i]表示只有i个石子时谁赢   1表示stan赢  0表示olive赢 i-a[j]表示从i个石子一次取走a[j]个还剩下的    所以有  当(i-a[j]>0&&d[i-a[j]]=0)时  d[i]=1; #include<cstdio> #include<

uva 1626 Brackets Sequence ?(动态规划)

状态表示方法:d[ i ][ j ]表示的是一条序列的开始和结束: 状态定义:d[ i ][ j ]表示字串s[ i~j ] 需要添加的数量. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n; char s[105]; int d[105][105]; bool match(char ch1,char ch2) { if((ch1=='['&&am

uva 116 Unidirectional TSP(动态规划,多段图上的最短路)

这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = max{cost[i+1][j+k]+c[i][j]}(k=-1,0,1) 关于最短路长度的求法,我们可以通过上边的状态转移方程递推求解.cost代表从第i列到第c-1列的最短路,只要找出cost[0][j](j代表行号)中的最大值,我们得到的结果就是最短路. 我们已经得到了最短路的长度.下一步,

UVA - 103 - Stacking Boxes (动态规划)

UVA - 103 Stacking Boxes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Background Some concepts in Mathematics and Computer Science are simple in one or two dimensions but become more complex when

UVa Live 4394 String painter - 动态规划

题目传送门 传送门 题目大意 给定两个字符串$s$,$t$,每次可以选择一个$s$的一个区间将它变成一个字符,问最后将$s$变成$t$的最少操作数. 当$s$某一段中每个字符都不同的时候,等价于对一个空串操作变成$t$的这一段. 考虑用$g_{l, r}$表示将空串,变成$t_{l}t_{l + 1}\cdots t_{r}$的最少操作数. 不难发现,如果我对一个区间$[l, r]$进行操作,满足下面两个条件不会更劣: $t_{l} = t_{r}$ 在这之后的操作要么被$[l + 1, r -

UVA 662 Fast Food +经典动态规划

题目链接:点击进入 以前也碰到过这种类型的dp,感觉就是状态不好定义和转移:原来定义状态的时候总是认为dp[i][j]就应该由dp[i-1][j-1]转移而来,这样的话就会导致需要记忆前面i-1步的所有状态,然后就是转移方程没法写了.对于这道题,我们定义状态dp[i][j]表示前j个餐馆建立i个仓库时的最小代价,然后状态转移为dp[i][j]=dp[i-1][k-1]+cost[k][j],意思是:已经建立的前i-1个仓库负责前k-1个餐馆,然后第i个餐馆负责第k–j个餐馆,其中k<=i<=j

The Tower of Babylon UVA - 437 DAG上的动态规划

题目:题目链接 思路:每个方块可以用任意多次,但因为底面限制,每个方块每个放置方式选一个就够了,以x y为底 z 为高,以x z为底 y 为高,以y z为底 x为高,因为数据量很小,完全可以把每一种当成DAG上的一个结点,然后建图找最长路径. AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cs

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes