1. 程式人生 > >hdu1159 poj1458 LCS裸題

hdu1159 poj1458 LCS裸題

ble memset bug def ans pair esp 奇怪 for

HDU 1159

題意:找LCS

思路:裸題 n*m的寫法,我的寫法好像比較奇怪。。。用一個ci保存s2第i位可以做為s1的公共子序列的最大值,s1的每一位遍歷s2,遍歷的時候記錄前面出現過的ci的最大值,ci一定是一個連序的上升序列,我的好像不是正經的LCS的算法,改天還是要學習一個的

AC代碼:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include 
"algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8;
const int N=1e5+100; const ll mod=1e9+7; char s1[1005],s2[1005]; int dp[1005],c[1005],ans; int main(){ ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); while(cin>>s1+1>>s2+1){ ans=0,mem(dp),mem(c); int l1=strlen(s1+1), l2=strlen(s2+1); for(int i=1; i<=l1; ++i){
int p=0; for(int j=1; j<=l2; ++j){ int t=c[j]; if(s1[i]==s2[j]){ dp[i]=max(dp[i],p+1); c[j]=max(c[j],dp[i]); } if(t==p+1) p++; } ans=max(ans,dp[i]); //for(int j=1; j<=l2; ++j) cout<<c[j]<<" ";cout<<endl; } cout<<ans<<endl; } return 0; }

hdu1159 poj1458 LCS裸題