hdu 4745 區間迴文最長長度

/*題意:就是給定n個環狀的數 倆個人一個從順時針  一個從逆時針 但是他們走的都要是在相等的數值上面
但是他們只能往前走 問他們能這樣走多少步*/
/*思路:題意他麼理解了好一會 就是一直往前走 不能回頭或者不走  因爲是一個環,在區間上去最優解就ok*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
#define inf 0x3f3f3f3f
#define eps 1e-10
#define maxl 1010
#define mem(i,j) memset(i,j,sizeof(i))
const int mod=1e9+7;
int v[maxl];
int d[maxl][maxl];//區間i~j裏面的最長迴文子串的長度
int main()
{
    freopen("in.txt", "r", stdin);
    int n;
    while(cin>>n&&n){
        memset(d,0,sizeof(d));
        for(int i=0;i<n;i++) {d[i][i]=1;cin>>v[i];}
        for(int i=n-1;i>=0;i--){//這裏就是預處理i~j裏面的最長迴文串的長度 直接求出來就好了  都沒有區間DP的感覺
            for(int j=i+1;j<n;j++){
                d[i][j]=max(d[i][j],max(d[i+1][j],d[i][j-1]));
                if(v[i]==v[j]) d[i][j]=max(d[i][j],d[i+1][j-1]+2);
            }
        }

        int ans=0;
        for(int i=0;i<n;i++){
            ans=max(ans,d[0][i]+d[i+1][n-1]);//0~i-1 i~n-1,A可以從i-1走到0,然後從n走到i,B可以從0走到i-1,從i走到n-1 .
            //cout<<d[0][i]<<' '<<d[i+1][n-1]<<endl;
        }
        cout<<ans<<endl;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章