ガチョウ工場2016実習生募集試験問題2
2922 ワード
タイトルの要求:abefbcaのような文字列を与えて、その中のいくつかの文字を削除することによって(もちろん削除しなくてもいい)、あなたは最も長い1つの回文列の長さを見つけることができますか?abefbcaを例にして、私たちはcを削除することができて、efのある1つを削除することができて、回文列abebaを得て、あるいはabfba、それでは最も長い回文列は5です.
当時は書けなかったなんて、汗動的計画解を用いて,dp[i][j]はi番目の文字からj番目の文字までの最大返信長を表す.サブ問題に分解:1.最長回文はj番目の文字を含み、i番目の文字からj番目の文字と同じ状況に遭遇するまで後方検索を開始し、このときの文字の下にkと表記され、得られた値temp=2+dp[k+1][j-1]である.2.最長回文はj文字目を含まず、temp 2=dp[i][j-1].
ではdp[i][j]はtempとtemp 2の最大値をとる.
当時は書けなかったなんて、汗動的計画解を用いて,dp[i][j]はi番目の文字からj番目の文字までの最大返信長を表す.サブ問題に分解:1.最長回文はj番目の文字を含み、i番目の文字からj番目の文字と同じ状況に遭遇するまで後方検索を開始し、このときの文字の下にkと表記され、得られた値temp=2+dp[k+1][j-1]である.2.最長回文はj文字目を含まず、temp 2=dp[i][j-1].
ではdp[i][j]はtempとtemp 2の最大値をとる.
#include
#include
#include
using namespace std;
int dp[1000][1000];
inline int max(int a, int b){
return a > b ? a : b;
}
int main(){
string s;
cin >> s;
int len = s.size();
for (int i = 0; i < len; i++){
dp[i][i] = 1;
}
for (int i = len - 1; i >= 0; i--){
for (int j = 0; j < len; j++){
if (i>j)
continue;
int temp = 1;
for (int k = i; k < j; k++){
if (s[k] == s[j]){
temp = 2 + dp[k + 1][j - 1];
}
}//temp s[j]
int temp2 = dp[i][j - 1];//temp2
dp[i][j] = max(temp, temp2);
}
}
cout << dp[0][s.size() - 1] << endl;
return 0;
}