UVA 4564 - Clickomania

来源:互联网 发布:宝马x5和奔驰gle 知乎 编辑:程序博客网 时间:2024/05/29 08:53

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2565

题        意:给你一串字符,可以将相连的三个以及以上的消去(空字符可以消去),问这个字符串能否完全消去?

思        路: 1,如果是空的,显然可以;

                     2,如果x,y是可以消除的(solvable) ,那么XY, AXA, AXAYA(由于空的也是可以,所以可以看成AAXA, AXAA) 都是可以的;其他就是不行的;
代码如下:

#include<stdio.h>#include<string.h>#include<algorithm>#include<stack>using namespace std;const int maxn = 200;typedef long long LL;int dp[maxn][maxn];char v[maxn];int ans;int  dfs( int i, int j ){    if( i == j ) return 0;//还剩一个,无法消去    if( i > j ) return 1;//到达边界,已完全消去    if( dp[i][j] != -1 ) return dp[i][j];//若已经判断过是否可以消去,则直接返回    for( int k = i+1; k < j; k ++ )        {            dp[i][j] = dfs( i, k ) && dfs( k+1, j );            if( dp[i][j] == 1 ) return 1;        }    if( v[i] == v[j] )    {        dp[i][j] = dfs( i+1, j-1 );        if( dp[i][j] == 1 ) return 1;        for( int k = i+1; k < j; k ++ )        {            if( v[i] == v[k] )            {                dp[i][j] = dfs( i+1, k-1 ) && dfs( k+1, j-1 );                if( dp[i][j] == 1 ) return 1;            }        }    }    return dp[i][j] = 0;}int main(){    while( scanf ( "%s", v ) != EOF )    {        int len = strlen( v );        memset( dp, -1, sizeof( dp ) );        ans = 0;        if( dfs( 0, len-1 ) )            printf("solvable\n");        else            printf("unsolvable\n");    }    return 0;}



0 0
原创粉丝点击