• DP_字串匹配(HDU_1501)


    最优子结构分析:如果A、B可以组成C,C最后一个字母必定是A或B的最后一个字母组成。
    C去除除最后一位,变成是否可以求出A-1和B或A和B-1是否可以构成C-1
    状态转移方程:用f[i][j] 表示A前 i 位和B前 j 位是否可以组成C的前i+j位        
        dp[i][j] = (dp[i-1][j] && A[i]==C[i+j]) || (dp[i][j-1] && B[j]==C[i+j])

    #include <stdio.h>
    #include <string.h>
    
    #define M 202
    
    char A[M],B[M],C[M*2];
    int dp[M][M];
    
    int run()
    {
        scanf("%s%s%s",A + 1,B + 1,C + 1);
        int aLen = strlen(A + 1);
        int bLen = strlen(B + 1);
        int cLen = strlen(C + 1);
        
        for(int i=1; i<=aLen; i++)
        {
            if(A[i] == C[i]) dp[i][0] = 1;
        }
        for(i=1; i<=bLen; i++)
        {
            if(B[i] == C[i]) dp[0][i] = 1;
        }
        for(i=1; i<=aLen; i++)
        {
            for(int j=1; j<=bLen; j++)
            {
                dp[i][j] = (dp[i-1][j] && A[i]==C[i+j]) || 
                           (dp[i][j-1] && B[j]==C[i+j]);
            }
        }
        return dp[aLen][bLen];
    }
    
    int main(int argc, char* argv[])
    {
        #ifdef __MYLOCAL
        freopen("in.txt","r",stdin);
        #endif
    
        int t;
        scanf("%d",&t);
        for(int i=1; i<=t; i++)
        {
            printf("Data set %d: %s
    ",i,run() ? "yes" : "no");
        }
    
        return 0;
    }
  • 相关阅读:
    更改sql server数据库所有者的对象
    对C#委托及事件委托的理解
    印度人是怎样开发软件的?
    SQL常用函数
    Ajax学习1
    Ajax学习2
    什么是ORM?
    jQuery 移动网页到制定的位置
    Juery 控件的取值赋值
    js禁用滚动条
  • 原文地址:https://www.cnblogs.com/lk1993/p/3227068.html
Copyright © 2020-2023  润新知