zoukankan      html  css  js  c++  java
  • HDU4745

    题目大意

    给出一个长度为n的环状序列,两只兔子各自从一个点出发,一个顺时针跳,一个逆时针跳,每个时刻都要求两只兔子所在的数字是相同的,兔子最多跳一个圈~~~问兔子们最多能跳多少次

    题解

    一个逆时针跳,一个顺时针跳,经过的数字刚好组成了一个回文串,所以题目的要求就是求最长的回文,不过序列是环状的!怎么办?我们看看样例:2 1 1 2 1 3 答案是5

    2 1 1 2 1 3,其实就是[1,4]区间的最长回文加上[5,6]区间的最长回文,因此我们枚举中间点i,求出max(dp[1,i]+dp[i+1,n])就是最终结果~~~~ 当时听学长说是没固定端点的LCS。。。就没去理了,早知道要是自己看题了,估计可以A掉,因为做过相类似的题目。。。

    代码交上去还拿了个rank1~~

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    #define MAXN 1005
    short dp[MAXN][MAXN];
    short a[MAXN];
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF&&n)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)scanf("%d",&a[i]);
            for(int i=0;i<n;i++) dp[i][i]=1;
            for(int i=n-1;i>=0;i--)
                for(int j=i+1;j<n;j++)
                    if(a[i]==a[j])
                        dp[i][j]=dp[i+1][j-1]+2;
                    else
                        dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
            int ans=dp[0][n-1];
            for(int i=0;i<n-1;i++) ans=max(ans,dp[0][i]+dp[i+1][n-1]);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    贪心法
    div 样式
    echarts标题(title)配置
    利用svg画路径图 vue
    vue 杂项
    Charset 0x0408D00000/MS936 is not supported by the JVM
    Android开发中Eclipse常用快捷键
    Java 中强制删除文件的方法
    利用html5的localStorage结合jquery实现日常费用查询器
    Ant编译utf8非法字符:/65279 解决方法
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3326296.html
Copyright © 2011-2022 走看看