uva10069 Distinct Subsequences(DP+大数)

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=1010

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <algorithm>
#define maxn 10000
using namespace std;
void reverse(string &ans,int ct){
    for(int i=0;i<ct/2;i++){
        swap(ans[i],ans[ct-1-i]);
    }
}
string mul(string a,string b){
    int la=a.length(),lb=b.length();
    string ans="";
    int c[maxn],ct=0,d[maxn];//c plus d num
    memset(d,0,sizeof d);
    reverse(a,la),reverse(b,lb);
    for(int i=0;i<lb;i++){
        memset(c,0,sizeof c);
        for(int j=0;j<la;j++){
            d[i+j]+=(b[i]-'0')*(a[j]-'0')+c[i+j];
            c[i+j+1]=d[i+j]/10;
            d[i+j]%=10;
        }
        if(c[i+la]) d[i+la]=c[i+la],ct=i+1+la;
        else ct=i+la;
    }
    int i=ct-1;
    //脠楼脟掳碌艗0
    while(i>=0&&d[i]==0) i--;
    if(i<0) ans="0";
    //
    else for(;i>=0;i--) ans+=d[i]+'0';
    return ans;
}
string add(string a,string b){
    int la=a.length(),lb=b.length();
    int c=0,ct;
    int d[maxn];
    string ans="";
    if(la>lb) swap(a,b),swap(la,lb);
    reverse(a,la),reverse(b,lb);
    for(int i=0;i<la;i++){
        d[i]=a[i]-'0'+b[i]-'0'+c;
        c=d[i]/10;
        d[i]%=10;
    }
    for(int i=la;i<lb;i++){
        d[i]=b[i]-'0'+c;
        c=d[i]/10;
        d[i]%=10;
    }
    if(c) d[lb]=c,ct=lb+1;
    else ct=lb;
    int i=ct-1;
    //脠楼脟掳碌艗0
    while(i>=0&&d[i]==0) i--;
    if(i<0) ans="0";
    //
    else for(;i>=0;i--) ans+=d[i]+'0';
    return ans;
}
string itoa(int x){
    string ans="";
    int ct=0;
    while(x){
        ans+=x%10+'0';
        x/=10,ct++;
    }
    reverse(ans,ct);
    return ans;
}
int t;
char a[10010],b[110];
string dp[10010][110];
int main(){
    //freopen("10069","r",stdin);
    scanf("%d",&t);
    for(int ca=1;ca<=t;ca++){
        scanf("%s%s",a+1,b+1);
        int la=strlen(a+1),lb=strlen(b+1);
        for(int i=0;i<=la;i++){
           for(int j=0;j<=lb;j++){
              dp[i][j]="0";
           }
        }
        for(int i=1;i<=la;i++){
           if(a[i]==b[1]) dp[i][1]=add(dp[i][1],"1");
           dp[i+1][1]=dp[i][1];
        }
        for(int i=2;i<=la;i++){
            for(int j=2;j<=lb;j++){
               if(a[i]==b[j]){
                  dp[i][j]=add(dp[i][j],dp[i-1][j-1]);
               }
               dp[i+1][j]=add(dp[i+1][j],dp[i][j]);
            }
        }
        cout<<dp[la][lb]<<endl;
    }
    return 0;
}
uva10069

 

posted @ 2014-02-09 20:37  wonderzy  阅读(212)  评论(0编辑  收藏  举报