題目大意:
給你兩串整數,要求你輸出最長公共子串行(串的長度是100000.)
時間限制:
1000
ms | 記憶體限制:
65535
kb所以無論是時間上還是空間上這都是需要進行比較精心的優化過後才行。這題我做了老半天然後各種優化最終都沒成功,都是超時了,然後dp陣列還開不到100000*
100000;而且這題網上的**頁找不到,最後只能求助大師了,看完大師的**後才恍然大悟,只恨自己太笨。仰天長嘯,然後將解題思路奉獻給更多的人吧。
#include
#include
#define n 100010
int a[n],b[n],dp[n];
int find(int l,int r,int value)//最長遞增子串行二分查詢。
return l; }
int main()
j=0;
for(i=1;i<=m;i++)
int len=j;//記錄b串的長度len
int r=0;//用來儲存最長遞增子串行的長度
j=0;
dp[0]=-1;//初始值嗎!
for(i=1;i<=len;i++)//動態規劃最長遞增子串行,這個不理解的話可以網上自己找!!
printf("%d\n",r);//輸出最長遞增子串行的長度不就行了
}
} 好了,我相信只要你認真讀完**,應該也就對本題了然於心了。
優化的關鍵在於題目給出每個字元都不相同,且每個字元都小於100000.所以可以開陣列來儲存所有出現在第乙個串中的字元出現的位置,然後第二個串只儲存在第乙個串中出現過的字元的位置。這樣在第二個串中遞增出現的數字就和第乙個串中出現的順序就肯定是公共子串。
#include #include #include #include #include #include using namespace std;
#define maxn 275005
#define mod 1000000
#define ll long long int
int z[100005];
int b[100005];
int fz[100005];
int fznum;
int find(int l, int r, int x)
return l;
}int main()
int bnum = 0;
for (int i = 0; i < m; ++i)
}fznum = 0;
for (int i = 0; i < bnum; ++i)
else
}} printf("%d\n", fznum);
}}
最長公共子串行 最長遞增子串行 最長遞增公共子串行
求最長公共子串行 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...
最長遞增子串行 最長公共子串行 最長公共子串
最長遞增子串行a 給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為8的陣列a,則其最長的單調遞增子串行為,長度為6.輸入描述 第一行包含乙個整數t,代表測試資料組數。對於每組測試資料 n 陣列的長度 a1 a2 an 需要計算的陣列 保證 1 n...