zoj3892Available Computation Sequence(区间dp)

来源:互联网 发布:u盘数据恢复文件乱码 编辑:程序博客网 时间:2024/05/21 09:45

这是一道简单的区间dp,刚开始没看到字符数目小于等于100

#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;const int MOD=1e9+7;ll dp[111][111][2];//第一维表示长度,第二维表示开头,0表示数字,1表示字母char s[100100];char s1[110];int cnt1,cnt2;int num[2220];void solve(){    for(int i=2;i<cnt2;i++){ //表示长度        for(int j=1;j+i-1<cnt2;j++){        //从哪里开始            for(int k=j;k<i+j-1;k++){       //第一个从哪里开始到哪里结束                if(s1[k]=='*'){                    dp[i][j][1]+=(dp[i-k+j-1][k+1][0]*dp[k-j+1][j][1])%MOD;                    dp[i][j][1]%=MOD;                    dp[i][j][1]+=(dp[i-k+j-1][k+1][1]*dp[k-j+1][j][0])%MOD;                    dp[i][j][1]%=MOD;                    dp[i][j][0]+=(dp[i-k+j-1][k+1][0]*dp[k-j+1][j][0])%MOD;                    dp[i][j][0]%=MOD;                }                if(s1[k]=='.'){                    dp[i][j][0]+=(dp[i-k+j-1][k+1][1]*dp[k-j+1][j][1])%MOD;                    dp[i][j][0]%=MOD;                }                if(s1[k]=='^'){                    dp[i][j][1]+=(dp[i-k+j-1][k+1][1]*dp[k-j+1][j][1])%MOD;                    dp[i][j][1]%=MOD;                }                if(s1[k]=='!'){                    dp[i][j][1]+=(dp[i-k+j-1][k+1][0]*dp[k-j+1][j][1])%MOD;                    dp[i][j][1]%=MOD;                    dp[i][j][1]+=(dp[i-k+j-1][k+1][1]*dp[k-j+1][j][0])%MOD;                    dp[i][j][1]%=MOD;                    dp[i][j][1]+=(dp[i-k+j-1][k+1][0]*dp[k-j+1][j][0])%MOD;                    dp[i][j][1]%=MOD;                    dp[i][j][0]+=(dp[i-k+j-1][k+1][1]*dp[k-j+1][j][1])%MOD;                    dp[i][j][0]%=MOD;                }            }        }    }}int main(){    int t;    scanf("%d",&t);    while(t--){       scanf("%s",&s);       int len=strlen(s);       mem0(num);       mem0(dp);       cnt1=1;       cnt2=1;       int flag=0;       for(int i=0;i<len;i++){            if(s[i]=='!'||s[i]=='.'||s[i]=='^'||s[i]=='*'){                s1[cnt1++]=s[i];                flag=0;            }            else if(flag==0){                if(s[i]>='0'&&s[i]<='9'){                    dp[1][cnt2][0]=1;                    cnt2++;                    flag=1;                }                else if(s[i]>='a'&&s[i]<='z'){                    dp[1][cnt2][1]=1;                    cnt2++;                    flag=1;                }            }       }       solve();       printf("%d\n",(dp[cnt1][1][0]+dp[cnt1][1][1])%MOD);    }    return 0;}
0 0
原创粉丝点击