zoj1733

来源:互联网 发布:2016中超网络直播乐视 编辑:程序博客网 时间:2024/05/17 04:34

水题的确是水题,不过数组开的小了,它会直接wa掉,而不是SE,我的方法依然很老,套式子,我找到一个好方法,是用滚动数组。

 

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int L;

void LCS(int i,int j,int b[][200])
{
 if(i <= 0 || j <= 0) return ;
 if(b[i][j] == 1)
 {
  L++;
  LCS(i-1,j-1,b);
 }
 else if(b[i][j] == 2)
  LCS(i-1,j,b);
 else LCS(i,j-1,b);
 
}
void LCSLen(char *x,char *y)
{
 int i,j;
 int c[200][200],b[200][200];
 int lenx = strlen(x+1),leny = strlen(y+1);
 
 for(i = 0;i <= lenx ;++i) c[i][0] = 0;
 for(i = 0;i <= leny ;++i) c[0][i] = 0;
 
 for(i =1;i <= lenx;++i)
 {
  for(j = 1;j <= leny;++j)
  {
   if(x[i] == y[j])
   {
    c[i][j] = c[i-1][j-1] + 1;
    b[i][j] =1;
   }
   else if(c[i-1][j] > c[i ][j -1])
   {
    c[i][j] = c[i -1][j];
    b[i][j] = 2;
   }
   else
   {
    c[i][j] = c[i ][j -1];
    b[i][j]= 3;
   }
  }
 }
 
 LCS(lenx,leny,b);
}

int main(void)
{
 int i,j;
 char x[200],y[200];
 while(cin >> x+1 >> y+1)
 {
  L = 0;
  LCSLen(x,y);
  cout << L << endl;
 }
 
 system("pause");
 return 0;
}

 

 

 

下面用的是滚动数组:::

#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
 char x[300],y[300];
 int r[300],s[300];
 int lenx,leny,i,j;
 
 while(cin >> x >> y)
 {
  lenx = strlen(x);
  leny = strlen(y);
  
  for(i = 0;i <= leny;++i) r[i] = 0;
  for(i = 0;i < lenx;++i)
  {
   for(j = 0;j < leny;++j)
    if(x[i] == y[j]) s[j+1] = r[j]+1;
    else s[j+1] = r[j+1] > s[j] ? r[j+1] : s[j];
   for(j = 1;j <= leny;++j)
    r[j] = s[j];
  }
  
  cout << r[leny] << endl;
 }
 
 system("pause");
 return 0;
}

 

 

 

 

原创粉丝点击