1. 程式人生 > >區間dp-hdu-4745-Two Rabbits

區間dp-hdu-4745-Two Rabbits

題目連結:

題目意思:

給n個環狀的數,A、B兩人沿相反的方向走,每單位時間走一步,要求相同時間兩人到達相同的數,且同一位置同一個人不能走兩次,走過的位置不能越過。

解題思路:

根據迴文非連續序列的性質,從前往後,和從後往前序列是一樣的,所以只用求出區間內最長的迴文序列即可,又由於是環狀,所以分成兩部分,1~i i+1~n,A可以從i走到1,然後從n走到i+1,B可以從1走到i,從i+1走到n .

程式碼:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#define eps 1e-6
#define INF 0x3fffffff
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define Maxn 1100
int sa[Maxn];
int dp[Maxn][Maxn];

int main()
{
   //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   int n;

   while(scanf("%d",&n)&&n)
   {
       memset(dp,0,sizeof(dp));
       for(int i=1;i<=n;i++)
       {
           scanf("%d",&sa[i]);
           dp[i][i]=1;
       }
       for(int i=2;i<=n;i++)
       {
           for(int j=1;j+i-1<=n;j++)
           {
               int k=i+j-1;
               dp[j][k]=max(dp[j][k],max(dp[j+1][k],dp[j][k-1]));
               if(sa[j]==sa[k])
                    dp[j][k]=max(dp[j][k],dp[j+1][k-1]+2);
           }
       }
       int ans=0;
       for(int i=1;i<=n;i++)
            ans=max(ans,dp[1][i]+dp[i+1][n]);
        printf("%d\n",ans);

   }
   return 0;
}


相關推薦

區間dp-hdu-4745-Two Rabbits

題目連結: 題目意思: 給n個環狀的數,A、B兩人沿相反的方向走,每單位時間走一步,要求相同時間兩人到達相同的數,且同一位置同一個人不能走兩次,走過的位置不能越過。 解題思路: 根據迴文非連續序列的性質,從前往後,和從後往前序列是一樣的,所以只用求出區間內最長的迴文序列即

HDU4745 Two Rabbits【最長迴文子序列 區間DP

Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2479    Accepted Su

HDU 5273 區間DP

main 一個 clu can ring 區間dp printf std scan 輸入一組數,m次詢問 問每一個詢問區間的逆序數有多少 區間DP簡單題 #include "stdio.h" #include "string.h" int dp[1010][1010

2017多校第9場 HDU 6170 Two strings DP

ems str php hdu 鏈接 兩種 namespace turn bit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 題意:給了2個字符串,其中第2個字符串包含.和*兩種特別字符,問第二個字符串能否和第一個

HDU 5791 Two (DP)

stream fine out tor printf bsp brush eps std 題意:給定兩個串,讓你求出,兩個串字串,相同的個數。 析:dp[i][j] 表示 第一個第 i 個位置,第二串第 j 個位置,有多少相同的串, 如果 a[i] == b[j] 那麽

HDU 5791 Two——DP

oci get sin com .com blank lan targe target 逼矩旅劫蒂毓乙橇綻醫潑斡蘸http://t.docin.com/adhcg9321 戲浩郎酚琢拾坡憑啪官咳http://t.docin.com/sina_5847836848 誓遜甲用匝

HDU 5115 區間dp

others take source [1] des def tro round 有一個 Dire Wolf Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Oth

You Are the One HDU - 4283(區間dp

eas value script names elf for stdio.h 表示 text You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav

HDU 4632 Palindrome subsequence(區間DP求回文子序列數)

pan get color math stdout 一個 inf 序列 star 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 題目大意:給你若幹個字符串,回答每個字符串有多少個回文子序列(可以不連續的子串)。解題

hdu 5115 Dire Wolf 區間dp

區間 fir print for () fine scanf include hdu 題目大意:有n頭狼,每頭狼初始戰力為ai, 每頭狼為給相鄰的狼加bi 戰力,讓你規定擊殺順序使得自己受到的傷害最小。 思路:訓練的時候一直沒有想出來,知道是區間dp,並且知道要枚舉

HDU - 2476 , H - String painter [ 區間dp ]

Problem Describe There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful stri

Hdu 3516 tree construction(區間DP四邊形優化)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3516 題意:給出n個點,後一個點在前一個點的右下方,然後用直線沿著座標軸將這些點連線起來,問最短的距離是多少。 思路:首先是用區間DP來列出狀態轉移方程,我列出來的方程是dp[i][j]=m

[區間DP] G - You Are the One HDU - 4283

You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5707&nb

hdu 6212 區間dp

題意:祖瑪遊戲,最少的彈藥消除所有珠子 思路:區間dp,注意列舉中間空一個珠子的情況,這裡要注意的是中間不能有兩個,並且兩邊的加中間列舉的也不能是三個(因為這樣不管先取左右都會直接被消除掉) 程式碼: #include<bits/stdc++.h> using nam

HDU - 5900】QSC and Master(區間dp

題幹: Every school has some legends, Northeastern University is the same.  Enter from the north gate of Northeastern University,You are facing

hdu 6212 區間dp Zuma (記憶化搜)

題意: 現在有一個01串,保證相同的連續不會超過2,現在可以向1其中的任意一個位置包括兩端插入一個0 或者1 ,如果組成3個或以上的連續的相同,則可以消除這個,然後剩下的接起來。直到所有的拿完,問最少插入幾個? 思路: 200 區間dp呀,dp[ l ][ r ] 表示

[區間dp] Dire Wolf HDU

區間DP 算是裸板吧 這次求的是最小值 題目大意:總共有N只狼排成一排,每隻狼都有一個基礎攻擊力ai,以及被擊殺後可給別的狼提供的攻擊力bi(一隻狼被攻擊的話,它相鄰的狼會為它提供額外的攻擊力bi),你擊殺一隻狼都會減少與這隻狼攻擊力加上相鄰的狼提供

HDU 5115 Dire Wolf (區間dp)

題意: 一群狼排成一排,每隻狼有一個固定攻擊值a[i],還有附加值他左右與它相鄰的狼給它的附加值,因此它對人的攻擊總值是固定攻擊值+附加值,一個人消滅第i只狼的同時會受到它的總攻擊值的傷害,問一個人要

hdu 4283"You Are the One"(區間DP)

傳送門 https://www.cnblogs.com/violet-acmer/p/9852294.html   題意:   有n個屌絲排成一排,每個屌絲都有一個不開心值a[ i ]( i=1,2,3,.....n ),如果第 i 個屌絲第 k 個上場,那麼他的不開心度就是(k-1)*a[

HDU-5115 Dire Wolf (區間dp

Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear to orig