呼啦啦呼啦啦

哟哟哟噗噗噗~~

数列(sequence)

数列(sequence)

【问题描述】

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

【输入】

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

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

【输出】

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

【样例】

sequence.in

    5

    1 1 2 5 4

    sequence.out

    3

    数据规模

    对于20%的数据,n〈=20;

    对于60%的数据,n〈=100;

    对于100%的数据,n〈=l000。

==============================

幸好这道题错了,让我发现我自己严重的错误...

1.开始状态的设计

   f[i]表示前i个数的最值

   但是在转移的时候出现了问题

   f[i]<——f[i-1];

   f[i]<——max(f[a[i],f[a[i]-1]+1){在这里就把之前状态的概念偷换了…}

 2.一定要注意状态的概念意义…

   就按开始的状态设计

   f[i]表示前i个数的最值

   转移时

   for i:=1 to n do

   for j:=i-1 downto 1 do

      if (a[i]-a[j]>0)and(i-j>=a[i]-a[j]) then

      f[i]:=max(f[i],f[j]+1);

======================================================

 

var
  n:longint;
  a:array[1..1000]of longint;
  f:array[0..1000]of longint;
procedure init;
begin
  assign(input,'sequence.in');
  assign(output,'sequence.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

function max(a,b:longint):longint;
begin
  if a>b then exit(a);
  exit(b);
end;

procedure main;
var
  i,j:longint;
  ans:longint;
begin
  readln(n);
  for i:=1 to n do read(a[i]);
  fillchar(f,sizeof(f),0);
  ans:=0;
  for i:=1 to n do
    begin
      if a[i]<=i then
        begin
          f[i]:=1;
          for j:=i-1 downto 1 do
            if (a[i]-a[j]>0)and(a[i]-a[j]<=i-j) then
              begin
                f[i]:=max(f[i],f[j]+1);
              end;
          if ans<f[i] then ans:=f[i];
        end;
    end;
  writeln(ans);
end;

begin
  init;
  main;
  terminate;
end.    


 

阅读更多
文章标签: output input 游戏
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭