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; 
    }
    

      

  • 相关阅读:
    第一次Java作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    Java中数组自定义排序与优先级队列笔记
    力扣每日一题:删除链表的倒数第N个节点
    又一次离谱的错误——运算符优先级
  • 原文地址:https://www.cnblogs.com/guangheli/p/12104264.html
Copyright © 2011-2022 走看看