密电破译-dp
題目背景
墨家家主召集弟子的原因是因為截獲了密電并破獲了重大情報,“公主薨,國王失蹤,墨家即將面臨滅頂之災”。
題目描述
密電是由大小寫字母組成字符串,密電之所以能破譯是因為墨家掌握了破解方法,密鑰是一個整數t,代表按字母表循環順位t個字母。
比如:
密電:Abccz
密鑰:1
破譯結果:Bcdda
但是,敵人其實加密方法早就已經升級了,凡是元音字母均不替換。
比如:
密電:Abccz
密鑰:1
破譯結果:Acdda
現在定義信息相似度為兩個字符串的最大公共子串的長度。 最大公共子串就是,兩個字符串的所有子串中能夠相互匹配上的最大長度的字串。 比如:“abcdmmm” 和 “ppabcdapabb”, 最大公共子串是"abcd",則相似度為4。
給定密文、密鑰求墨家破譯信息的相似度為多少。
輸入格式
第一行,一個字符串s(由大小寫字母構成,s.length≤1000)代表密文;
第二行,一個整數t(0≤t≤1000)。
輸出格式
一個整數,代表相似度。
輸入輸出樣例
輸入 #1復制
Accepted
3
輸出
2
輸入
mxrartfwkb
1
輸出
6
解題思路:
難在審題要清楚,搞懂題目在講什么哦!!!
代碼如下:
#include <iostream> #include <cstring> using namespace std; string a, b; const int N = 1010; int dp[N][N]; int n;int main() {cin >> a;cin >> n;string b = a;int len = a.length();for (int i = 0; i < len; i++) {if (a[i] == 'A' || a[i] == 'E' || a[i] == 'I' || a[i] == 'O' || a[i] == 'U' ||a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')continue;else {a[i] = a[i] + n % 26;if (a[i] > 'z')//因為小寫字母的ASCII碼比大寫字母的大,所以//我們先判斷小寫字母a[i] = a[i] - 'z' + 'a' - 1;else if (a[i] > 'Z' && a[i] < 'a')//注意要加小于'a'a[i] = a[i] - 'Z' + 'A' - 1;}}for (int i = 0; i < len; i++) {b[i] = b[i] + n % 26;if (b[i] > 'z')b[i] = b[i] - 'z' + 'a' - 1;else if (a[i] > 'Z' && b[i] < 'a')b[i] = b[i] - 'Z' + 'A' - 1;}int maxs = -1;//求最長公共子串for (int i = 1; i <= len; i++)for (int j = 1; j <= len; j++) {if (a[i - 1] == b[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = 0;maxs = max(dp[i][j], maxs);}cout << maxs << endl;return 0; }總結