大家都知道,glory不但知識水平高,並且非常喜歡思考,有一天glory在思考乙個問題,他在紙上寫了兩個1到n的排列,並且他想知道這兩個排列的最大公共子串行的長度是多少,當然像glory這麼優秀的人當然一眼就看出了這個題目的答案,但是他太忙了,不想打這個**,於是他扔給了他的小弟,但是他的小弟知識水平不夠,所以他想找你萌幫幫他,你萌能幫他解決這個問題嗎。
第一行乙個數t,表示資料的測試組數(t<=5)
每組資料乙個n,表示排列的長度(1<= n <= 1e5)
接下來兩行,每行乙個1~n的排列
對於每組資料,輸出乙個數表示最長公共子串行的長度。
221 2
1 23
1 3 2
2 3 1
21
分析:原本自己寫的時候是建兩個陣列,如何通過多重迴圈來依次尋找子串行,取最大長度。迴圈很複雜,把自己弄暈了也沒解出這道題,看了網上的一篇帖子,用二維陣列來求解,兩個數字序列分別表示橫縱座標,可以比較容易解題。論好思路的重要性!
附上自己寫的**:
#includeusing namespace std;
int main()
for(int j=0;j>b[j];
}int flag[n][n],max=0;
for(int i=0;i=0)&&(j-1>=0)&&(flag[i-1][j-1]>=1))
else flag[i][j]=1;
}else flag[i][j]=0;
if(max}
}cout<}
} return 0;
}
三種演算法求乙個數字序列的最長遞增子串行
也有很多部落格寫如何實現最長遞增子串行的演算法,自己查閱了一些資料總結出三種實現的演算法,兩種是常見的處理思路,還有一種是本人自己想出來的演算法,很好理解,但是效率不是特別高。演算法一 將n個數的原序列a n 排序後得到遞增序列b n 則把求a的最長單調遞增子串行問題轉化成求a b序列的最長公共子串...
求兩個字串的最長公共子串行
autor baker time 25 5 06 求兩個字串的最長公共子串行。x的乙個子串行是相應於x下標序列的乙個子串行,求解兩個序列的所有子串行中長度最大的,例如輸入 pear,peach輸出 pea。分析 次題可用動態規劃演算法解決。首先定義乙個二維陣列 a a i j m g ddgg dd...
求兩個字串的最長公共子串行
方法 一 遞迴 採用遞迴的方法,簡單,但是速度比較慢,當字串比較大的時間,多次遞迴會計算一些重複的過程,因此速度很很慢。include using namespace std int lcslength int i,int j string x,y int lenx,leny int main re...