最長遞增子串行a
給定乙個長度為n的陣列,找出乙個最長的單調自增子序列(不一定連續,但是順序不能亂)
例如:給定乙個長度為8的陣列a,則其最長的單調遞增子串行為,長度為6.
輸入描述:
第一行包含乙個整數t,代表測試資料組數。輸出描述:對於每組測試資料:
n-陣列的長度
a1 a2 ... an (需要計算的陣列)
保證:1<=n<=3000,0<=ai<=max_int.
對於每組資料,輸出乙個整數,代表最長遞增子串行的長度。輸入例子:
2輸出例子:789 256 78 1 46 78 8
56 4 8 2 17
3輸出描述:採用o(nlogn)的優化演算法,**如下
演算法核心主要思想:採用乙個輔助陣列,來存放最長遞增子串行;更新策略為(1)對於乙個新資料,在輔助陣列中已經有的序列中尋找第乙個大於當前資料的元素並把它替換(2)若新資料大於輔助陣列中最大的元素,則擴張輔助陣列一次單位。重複上述過程直到結束,由於輔助陣列即為最長遞增子串行的長度,故返回輔助陣列長度即可。遍歷資料的複雜度為o(n),更新策略採用二分查詢的方法,演算法複雜度為o(logn),故總的演算法複雜度為o(nlogn)
#includeusing namespace std;
int er(int *a,int time)
end[l]=a[i];
right=l>right?l:right;
}return right+1;
}int main()
,則其最長的單調遞增子串行為,長度為6.
輸入描述:
第一行包含乙個整數t,代表測試資料組數。
對於每組測試資料:
n-陣列的長度
a1 a2 ... an (需要計算的陣列)
保證:1<=n<=3000,0<=ai<=max_int.
對於每組資料,輸出乙個整數序列,代表最長遞增子串行。輸入例子:若有多組最長上公升子串行,輸出第一組。
保證:1<=t<=20,1<=n<=3000,0<=ai<=max_int.
2輸出例子:789 256 78 1 46 78 8
56 4 8 2 17
1 46 78由於要求有多個最長子序列則輸出第乙個,故第一題中的方法不適用。自己採用新建乙個類 類中包含2個元素 length和value分別為當前位置最長遞增子串行的長度和上乙個與之比較元素的下標索引6 8 17
上面為對應過程,遍歷每乙個元素並更新對應length和index**如下
#include#includeusing namespace std;
class l
;void vd(int *a, int n)
int max = 0;
for (int i = 0; i < n - 1; i++)
if (p[j].length > max)//記錄最長子序列的長度
max = p[j].length;
}} }
int index = 0;
for (int i = 0; i < n; i++) }
l temp = p[index];
int t = index;//輸出子串行
while (temp.index>=0)
s.push(a[t]);
while (s.size()!=1)
cout << s.top()<< endl;
s.pop();
}int main()
}}
對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3...un和v1,v2,v3...vn,其中ui給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於300。
測試樣例:
"1a2c3d4b56",10,"b1d23ca45b6a",12
返回:6
int findlcs(string a, int n, string b, int m)
return dp[n][m];
}
最長公共子串
對於兩個字串,請設計乙個時間複雜度為o(m*n)的演算法(這裡的m和n為兩串的長度),求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,..un和v1,v2,...vn,其中ui + 1 == ui+1,vi + 1 == vi+1,同時ui == vi。
給定兩個字串a和b,同時給定兩串的長度n和m。
測試樣例:
"1ab2345cd",9,"12345ef",7
返回:4公共子串要求為連續 與上一題有些不同
class longestsubstring
return max;}};
最長公共子串行 最長遞增子串行 最長遞增公共子串行
求最長公共子串行 int dp maxn maxn int a maxn b maxn int main else dp i j max dp i 1 j dp i j 1 printf d n dp m n return 0 輸出最長公共子串行 int dp maxn maxn int d max...
最長公共子串行 最長遞增子串行
最長公共子串行 dp 杭電1159 include using namespace std string str1,str2 int dp 1005 1005 intlcs return dp str1.size str2.size int main 最長遞增子串行 杭電1257 include u...
最長公共遞增子串行
題目描述小h最近看了諜戰電影,對裡面訊息的加密方式很感興趣,他決定和朋友試一試,小h給朋友兩個序列,兩個序列的最長公共單調遞增子串行就是要傳遞的訊息,有時候序列太長了,小h的朋友找不出來,所以他找到了你 輸入第乙個數字n表示序列長度 後面兩行每行n個數字表示小h給出的兩個序列 n 1000 輸出輸出...