zoukankan      html  css  js  c++  java
  • DP:数列

    题目描述 Description
    虽然msh长大了,但她还是很喜欢找点游戏自娱自乐。有一天,她在纸上写了一串数字:1,l,2,5,4。接着她擦掉了一个l,结果发现剩下l,2,4都在自己所在的位置上,即1在第1位,2在第2位,4在第4位。她希望擦掉某些数后,剩下的数列中在自己位置上的数尽量多。她发现这个游戏很好玩,于是开始乐此不疲地玩起来……不过她不能确定最多能有多少个数在自己的位置上,所以找到你,请你帮忙计算一下!
     
    输入输出格式 Input/output
    输入格式:
    第一行为一个数n,表示数列的长度。
    接下来一行为n个用空格隔开的正整数,第i行表示数Ai。
    输出格式:
    一行一个整数,表示擦掉某些数后,最后剩下的数列中最多能有多少个数在自己的位置上,即Ai=i最多能有多少。
     
    输入输出样例 Sample input/output
    样例测试点#1
    输入样例:
    5
    1 1 2 5 4
     
    输出样例:
    3
    说明 description
    对于20%的数据,n≤20;
    对于60%的数据,n≤100;
    对于100%的数据,n≤l000。

    thought of my own:
    f[i,j]表示前i个数删去j个数满足题意的最大值

    如果init[i]=i-j,那么有删去和保留两种选择,f[i,j]:=max(f[i-1,j-1],f[i-1,j]+1)
    如果init[i]<>i-j,那么也有删去和保留两种选择,f[i,j]:=max(f[i-1,j-1],f[i-1,j])

    f[i,j]:=max(f[i-1,j-1],f[i-1,j]+1) init[i]=i-j
    max(f[i-1,j-1],f[i-1,j]) init[i]<>i-j

    var n:longint;
    init:array[1..1000]of longint;
    f:array[1..1000,0..1000]of longint;
    i,j,k:longint;
    max:longint;
    function find_max(x,y:longint):longint;
    begin if x>y
    then exit(x)
    else exit(y);
    end;
    begin readln(n);
    for i:=1 to n do
    read(init[i]);
    fillchar(f,sizeof(f),0);
    f[1,1]:=0;
    if init[1]=1
    then f[1,0]:=1;
    for i:=2 to n do
    for j:=1 to i do
    if init[i]=i-j
    then f[i,j]:=find_max(f[i-1,j]+1,f[i-1,j-1])
    else f[i,j]:=find_max(f[i-1,j-1],f[i-1,j]);
          max:=0;
    for i:=0 to n do
    if f[n,i]>max
    then max:=f[n,i];
    writeln(max);
    end.
  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4882405.html
Copyright © 2011-2022 走看看