zoukankan      html  css  js  c++  java
  • BZOJ 3304: [Shoi2005]带限制的最长公共子序列 动态规划

    800年没写DP了,一个傻逼题调半天. 

    code: 

    #include <cstdio> 
    #include <cstring> 
    #include <algorithm> 
    #define N 504 
    #define inf -10000 
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std; 
    int f[2][N][N];   
    char A[N],B[N],C[N];   
    void getmax(int &a,int b) 
    {
        if(b>a) a=b; 
    }
    int main() 
    { 
        // setIO("input");       
        int x,y,z,i,j,k;  
        scanf("%s%s%s",A+1,B+1,C+1);   
        x=strlen(A+1); 
        y=strlen(B+1); 
        z=strlen(C+1);    
        memset(f,-0x3f,sizeof(f));                                                
        f[0][0][0]=0;   
        int ans=0;      
        for(i=0;i<=x;++i) 
        {
            int now=i%2;    
            f[now][0][0]=0;          
            for(j=0;j<=y;++j) 
            {        
                for(k=0;k<=min(z,min(i,j));++k)           
                { 
                    if(i+j+k) f[now][j][k]=inf;                                            
                    if(i) getmax(f[now][j][k],f[now^1][j][k]);          
                    if(j) getmax(f[now][j][k],f[now][j-1][k]);     
                    if(i&&j&&A[i]==B[j]) getmax(f[now][j][k],f[now^1][j-1][k]+(A[i]==B[j]));                  
                    if(i&&j&&k&&(A[i]==B[j]&&B[j]==C[k])) getmax(f[now][j][k],f[now^1][j-1][k-1]+1);  
                }                                        
            }                  
        }                  
        if(max(f[0][y][z],f[1][y][z])<z) printf("NO SOLUTION
    ");  
        else printf("%d
    ",max(f[0][y][z],f[1][y][z]));  
        return 0; 
    }
    

      

  • 相关阅读:
    mybatis 版本问题
    sonar-maven-plugin问题
    spring容器&classLoader
    Mybatis知识点整理
    防重复提交的方式汇总
    秒杀系统设计整理
    MySQL事务隔离级别&锁
    disruptor解读
    springboot 2.x集成log4j2调试日志无法关闭问题
    Java并发——volatile
  • 原文地址:https://www.cnblogs.com/guangheli/p/12104264.html
Copyright © 2011-2022 走看看