acm--pku--1458

问题描述:

  问题地址:http://poj.org/problem?id=1458

  查看两个字符串相同子窜的最长长度。

  举例子:

Sample Input

abcfbc         abfcab
programming    contest 
abcd           mnp

Sample Output

4
2
0
从这个例子中可以看出用简单的动态规划就可以了。状态转移的式子是
 if(node1[i-1]==node2[j-1])         
       { 
                   sum[i][j]=sum[i-1][j-1]+1;   
             }  
             else  
              {       
             if(sum[i][j-1]>sum[i-1][j])  
                      sum[i][j]=sum[i][j-1];   
                 else                   
     sum[i][j]=sum[i-1][j];        
        }
全部代码为:
  #include<iostream>
#include<string.h>
using namespace std;
int main()
{   
 int sum[210][210];  
  char node1[210];   
 char node2[210];   
 int m,n;   
 int i,j,k;   
 while(cin>>node1>>node2)  
  {       
 //scanf("%s",node1);      
 // scanf("%s",node2);   
    // if(node1==""&&node2=="")    
   // break;      
  i=0;       
 while(node1[i]!='\0')i++;     
   m=i;     
   i=0;       
 while(node2[i]!='\0')i++;   
     n=i;      
  for(i=0;i<=n;i++)      
  sum[0][i]=0;       
 for(i=0;i<=m;i++)     
   sum[i][0]=0;     
   for(i=1;i<=m;i++) 
       {          
  for(j=1;j<=n;j++)  
          {             
   if(node1[i-1]==node2[j-1])  
              {                 
   sum[i][j]=sum[i-1][j-1]+1;      
          }           
     else              
  {                 
   if(sum[i][j-1]>sum[i-1][j])  
                      sum[i][j]=sum[i][j-1];  
                  else                   
     sum[i][j]=sum[i-1][j];            
    }       
     }     
   }      
 // printf("%d\n",sum[m][n]);     
   cout<<sum[m][n]<<endl;    
}   
 return 0;
}
posted @ 2011-05-17 13:11  gui__li  阅读(224)  评论(0)    收藏  举报