zoukankan      html  css  js  c++  java
  • 【洛谷 1799】数列

    题目描述

    虽然msh长大了,但她还是很喜欢找点游戏自娱自乐。有一天,她在纸上写了一串数字:1,l,2,5,4。接着她擦掉了一个l,结果发现剩下l,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些数后,剩下的数列中在自己位置上的数尽量多。她发现这个游戏很好玩,于是开始乐此不疲地玩起来……不过她不能确定最多能有多少个数在自己的位置上,所以找到你,请你帮忙计算一下!

    输入格式

    第一行为一个数n,表示数列的长度。

    接下来一行为n个用空格隔开的正整数,第i行表示数Ai。

    输出格式

    一行一个整数,表示擦掉某些数后,最后剩下的数列中最多能有多少个数在自己的位置上,即Ai=i最多能有多少。

    输入输出样例

    输入 #1
    5
    1 1 2 5 4
    
    输出 #1
    3

    说明/提示

    对于20%的数据,n≤20;

    对于60%的数据,n≤100;

    对于100%的数据,n≤l000。

    题解:emm和最长公共子序列好像哦。。。

               f [ i ][ j ]表示的就是前i个字符,保留j个最多能有多少个处在自己位置上

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1003;
    int n,a[N],f[N][N],ans;
    int main(){
        freopen("1799.in","r",stdin);
        freopen("1799.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
            for(int j=i;j>=1;j--){
                if(a[i]==j) f[i][j]=max(f[i-1][j],f[i-1][j-1]+1);
                else f[i][j]=max(f[i-1][j],f[i-1][j-1]);
            }
        }
        for(int i=1;i<=n;i++) 
            ans=max(ans,f[n][i]);
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    一本书
    在linux oracle 10g/11g x64bit环境中,goldengate随os启动而自己主动启动的脚本
    关于仿酷狗音乐播放器开源:寻求一套音乐播放器素材,让仿酷狗开源
    Cocos2d-x中Vector&lt;T&gt;容器以及实例介绍
    成都传智播客Java/PHP培训就业率高
    P1341 无序字母对
    P1168 中位数
    P1146 硬币翻转
    P1340 兽径管理
    P2023 [AHOI2009]维护序列
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11858159.html
Copyright © 2011-2022 走看看