第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 D psd面試(最長迴文子序列,區間dp)
阿新 • • 發佈:2019-01-06
題目描述
掌握未來命運的女神 psd 師兄在拿了朝田詩乃的 buff 後決定去實習。
埃森哲公司註冊成立於愛爾蘭,是一家全球領先的專業服務公司,為客戶提供戰略、諮詢、數字、技術和運營服務及解決方案。他們立足商業與技術的前沿,業務涵蓋40多個行業,以及企業日常運營部門的各個職能。憑藉獨特的業內經驗與專業技能,以及翹楚全球的交付網路,他們幫助客戶提升績效,併為利益相關方持續創造價值。埃森哲是《財富》全球500強企業之一,目前擁有約41.1萬名員工,服務於120多個國家的客戶。於是psd打算去埃森哲公司投一下簡歷。
於是他用英文寫了一篇簡歷,由於手速太快了以致自己都不知道寫了什麼。 然而面試官 xwc 一眼就看到了重點:大學打過 ACM! xwc:“
聽說你很低襖?考你個題:
忽略字母大小寫,你這篇簡歷去掉最長的迴文子序列後還有多長? ” psd 順手就把這個問題拋給了你。
輸入描述:
多組輸入,每組輸入一個長度不超過 1234 的沒空格的字串,是 psd 的簡歷。
輸出描述:
每組輸出一個整數,如題。
輸入
google
輸出
2
輸入
aBc,bAd
輸出
2
思路
定義:dp[i][j]表示區間i~j
的最長迴文子序列長度,那麼對於一個區間[j,j+i]
,如果第j
個元素和第j+i
個元素相等,那麼它的答案就等於dp[j+1][j+i-1]
的值+2,否則,就在dp[j+1][j+i]
和dp[j][j+i-1]
中取一個最大值
這個題只需要都轉換成小寫就行了
程式碼
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stdlib.h>
#include <string>
#include <map>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
#define inf 1000000
#define mem(a,b) memset(a,b,sizeof(a))
const int N=1234+7;
int f[N][N];
int main()
{
string s;
while (cin>>s)
{
mem(f,0);
int len=s.length();
for(int i=0; i<len; i++)f[i][i]=1;
for(int k=1; k<len; k++)
{
for(int i=0; i+k<len; i++)
{
int j=i+k;
if(tolower(s[i])==tolower(s[j]))
f[i][j]=max(f[i][j],f[i+1][j-1]+2);
else
f[i][j]=max(f[i+1][j],f[i][j-1]);
}
}
printf("%d\n",len-f[0][len-1]);
}
return 0;
}