zoukankan      html  css  js  c++  java
  • dp--poj1458最长公共子序列

    很水的一题

    输入串a与串b;

    Dp[i][j]表示a串中1~i与b串中1~j的子串的最长公共子序列。

                   Max{dp[i-1][j], dp[i][j-1]}       (a[i]!=b[j])

    Dp[i][j]=  Dp[i-1][j-1]+1           (a[i]==b[j])

    最后,a,b的最长公共子序列为dp[strlen(a)][strlen(b)]


    但是我居然细节出错了尼玛。。


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int max3(int a,int b,int c){
    	int d=b>c?b:c;
    	return a>d?a:d;
    }
    int max2(int a,int b){
    	return a>b?a:b;
    }
    
    int dp[1001][1001];
    int main(){
    char a[1001],b[1001];
    while(cin>>a>>b){
    int lena=strlen(a);
    int lenb=strlen(b);
    	memset(dp,0,sizeof(dp));
    	int i,j;
    	if(a[0]==b[0])dp[0][0]=1;
    	for(i=1;i<lena;i++)
    	{
    	//	dp[i][0]+=dp[i-1][0];
    		if(a[i]==b[0])dp[i][0]++;
    		else dp[i][0]=dp[i-1][0];  //忘了这边也要判断一下,晕
    	}
    	for(i=1;i<lenb;i++)
    		{
    	//		dp[0][i]+=dp[0][i-1];
    			if(a[0]==b[i])dp[0][i]++;
    			else dp[0][i]=dp[0][i-1];
    		}
    	for(i=1;i<lena;i++)
    		for(j=1;j<lenb;j++){
    			//dp[i][j]+=max2(dp[i-1][j],dp[i][j-1]);
    
    			if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
    			else
    			dp[i][j]=max2(dp[i][j-1],dp[i-1][j]);
    			}
    		cout<<dp[lena-1][lenb-1]<<endl;
    		}
    
    	return 0;
    }
    


    当然 这个是从0开始的所以需要特判,,


    如果输入从1开始就然后[0]赋值0就好了,不需要特判


    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std;
    char a[1000];    
    char b[1000];
    int dp[1000][1000];              //dp[i][j] is a[1~i] and b[1~j]'s common string's longest lenth
    int main(){
        while(scanf("%s",a+1)!=EOF){  //cin one of the string
             scanf("%s",b+1);     //cin the other
             int lena=strlen(a+1);
             int lenb=strlen(b+1);
             for(int i=0;i<=lena;i++){
                     dp[i][0]=0;
                     }
             for(int j=0;j<=lenb;j++){
                     dp[0][j]=0;
                     }
             for(int i=1;i<=lena;i++){
                     for(int j=1;j<=lenb;j++){
                             if(a[i]==b[j]){
                                dp[i][j]=dp[i-1][j-1]+1;
                                }
                             else{
                                dp[i][j]=((dp[i-1][j])>(dp[i][j-1]))?(dp[i-1][j]):(dp[i][j-1]);
                                }
                                }
                                }
             printf("%d
    ",dp[lena][lenb]);
             }
        return 0;
    }




    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    2019年8月22日 星期四(杂谈)
    文件读写
    log4j
    java 读写 xlsx
    mongodb的增删改查
    mongodb安装与简单配置
    mondb的特性
    mongodb 的简单应用
    linux 学习1
    linux 安装MySql
  • 原文地址:https://www.cnblogs.com/france/p/4808662.html
Copyright © 2011-2022 走看看