当前位置: 代码迷 >> 综合 >> HDU4745 Two Rabbits(区间dp)
  详细解决方案

HDU4745 Two Rabbits(区间dp)

热度:45   发布时间:2024-01-12 14:58:59.0

wsfw 卡在最后的答案统计了,看了别人的博客,觉得很有道理。
先破环成链,答案有两种情况:
1.在一段区间(最长为n)中的回文子序列:12321。两人站在l,r的位置开始行动
2.对于一个长度为n-1的序列来说,str[l-1]==str[r+1],所以有一种情况是两人站在l-1,r+1的位置开始行动。(说白了,l-1,r+1是同一个点,这种情况就是起点相同的情况。)

#include <bits/stdc++.h>using namespace std;
//-----pre_def----
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
#define fir(i, a, b) for (int i = (a); i <= (b); i++)
#define rif(i, a, b) for (int i = (a); i >= (b); i--)
#define endl '\n'
#define init_h memset(h, -1, sizeof h), idx = 0;
#define lowbit(x) x &(-x)//---------------
const int N = 2e3 + 10;
int n, d[N];
int f[N][N];
void init() {
    }
int main()
{
    
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);int StartTime = clock();
#endifwhile (scanf("%d", &n), n){
    fir(i, 1, n){
    scanf("%d", &d[i]), d[i + n] = d[i];}n <<= 1;memset(f, 0, sizeof f);fir(i, 1, n) f[i][i] = 1;int ans = 0;fir(len, 2, n){
    for (int l = 1; l + len - 1 <= n; l++){
    int r = l + len - 1;//f[l][r]if (d[l] == d[r]){
    f[l][r] = max(f[l][r], f[l + 1][r - 1] + 2);}else{
    f[l][r] = max({
    f[l][r], f[l + 1][r], f[l][r - 1]});}}}fir(i, 1, n / 2){
    ans = max({
    ans, f[i][i + n / 2 - 1], f[i][i + n / 2 - 2] + 1});}printf("%d\n", ans);}
#ifndef ONLINE_JUDGEprintf("Run_Time = %d ms\n", clock() - StartTime);
#endifreturn 0;
}