1. 程式人生 > >第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 D psd面試(最長迴文子序列,區間dp)

第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽 D psd面試(最長迴文子序列,區間dp)

題目描述

掌握未來命運的女神 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; }