题解

303 条题解

  • 0
    @ 2009-10-29 11:38:54

    #include

    int main()

    {

    int n;

    int max=0;

    int up[101]={0},down[101]={0};

    int height[101];

    int i,j;

    scanf("%d",&n);

    for(i=1;i

  • 0
    @ 2009-10-25 06:27:12

    var

    a,b,c:array[1..10000]of integer;

    i,j,n,max:integer;

    begin

    readln(n);

    for i:=1 to n do

    read(a[i]);

    for i:=1 to n do

    begin

    b[i]:=1;

    for j:=1 to i-1 do

    if (a[i]>a[j])and(b[j]+1>b[i]) then

    b[i]:=b[j]+1;

    end;

    for i:=n downto 1 do

    begin

    c[i]:=1;

    for j:=i+1 to n do

    if (a[i]>a[j])and(c[j]+1>c[i]) then

    c[i]:=c[j]+1;

    end;

    for i:=1 to n do

    if b[i]+c[i]>max then

    max:=b[i]+c[i];

    writeln(n-max+1);

    end.

  • 0
    @ 2009-10-23 21:30:47

    出去的人数....WA了2次

  • 0
    @ 2009-10-23 14:21:52

    var

    a:array[1..100]of integer;

    b:array[1..100,1..2]of integer;

    i,j,n,max:integer;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a[i]);

    b:=1; b:=1;

    for j:=1 to i-1 do

       if (a[j]b) then b:=b[j,1]+1;

    end;

    for i:=n downto 1 do

    for j:=n downto i+1 do

    if (a[j]b) then b:=b[j,2]+1;

    for i:=1 to n do

    if b+b>max then max:=b+b;

    writeln(n-max+1);

    end.

  • 0
    @ 2009-10-20 19:45:11

    var

    a:array[1..100]of integer;

    b:array[1..100,1..2]of integer;

    i,j,n,max:integer;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a[i]);

    b:=1; b:=1;

    for j:=1 to i-1 do

       if (a[j]b) then b:=b[j,1]+1;

    end;

    for i:=n downto 1 do

    for j:=n downto i+1 do

    if (a[j]b) then b:=b[j,2]+1;

    for i:=1 to n do

    if b+b>max then max:=b+b;

    writeln(n-max+1);

    end.

  • 0
    @ 2009-10-18 00:01:25

    var

    a:array[1..100]of integer;

    b:array[1..100,1..2]of integer;

    i,j,n,max:integer;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a[i]);

    b:=1; b:=1;

    for j:=1 to i-1 do

    if (a[j]b) then b:=b[j,1]+1;

    end;

    for i:=n downto 1 do

    for j:=n downto i+1 do

    if (a[j]b) then b:=b[j,2]+1;

    for i:=1 to n do

    if b+b>max then max:=b+b;

    writeln(n-max+1);

    end.

  • 0
    @ 2009-10-17 12:15:08

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    动态规划,认真审题就行。。。

  • 0
    @ 2009-10-11 11:25:07

    var

    a,f,g:array[0..1000] of longint;

    i,j,k,l,m,n,x,y,z:longint;

    begin

    readln(n);

    for i:=1 to n do

    read(a[i]);

    for i:=n downto 1 do

    begin

    for j:=i+1 to n do

    if (a[j]

  • 0
    @ 2009-10-11 11:08:27

    program hechang;

    var

    i,j,k,l,m,n,max:longint;

    a,f,g:array[0..500] of longint;

    begin

    readln(n);

    for i:=1 to n do

    read(a[i]);

    for i:=1 to n do begin

    f[i]:=1;

    g[i]:=1;

    end;

    for i:=2 to n do

    for j:=1 to i-1 do

    if (a[i]>a[j]) and (f[i]a[j]) and (g[i]max

    then begin

    max:=f[i]+g[i]-1;

    end;

    writeln(n-max);

    end.

  • 0
    @ 2009-10-07 21:58:25

    A了半天都没C

  • 0
    @ 2009-10-05 11:25:02

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    两个循环。

    第一个是求最长不下降子序列,

    第二个是反着得的再求一边、

    两次的相加,取最大的,就是不要出列的。

    用N一减就是出列的。

  • 0
    @ 2009-09-22 18:02:45

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    最长不下降子序列。。。

    for(a=n-2;a>=0;a--)

    for(b=a+1;b

  • 0
    @ 2009-09-21 20:06:10

    program he_chang_dui_xing;

    const maxn=100;

    var i,j,k,m,n,o,u,ans:longint;

    b,p,q:array[0..maxn]of longint;

    begin

    read(n);

    for o:=1 to n do read(b[o]);

    for i:=2 to n do

    for j:=i-1 downto 1 do

    if (b[i]>b[j])and(p[j]+1>p[i]) then p[i]:=p[j]+1;

    for i:=n-1 downto 1 do

    for j:=i+1 to n do

    if (b[i]>b[j])and(q[j]+1>q[i]) then q[i]:=q[j]+1;

    ans:=0;

    for i:=1 to n do

    if p[i]+q[i]+1>ans then ans:=p[i]+q[i]+1;

    writeln(n-ans);

    end.

  • 0
    @ 2009-09-20 13:00:38

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    1。暴搜求中间数。

    2。分开其左右两边(包含中间)。

    3。求最长上升(左)和最长下降(右)子序列。

    4。左边+右边-1(求最大)。

    5。总人数减去最大。

    程序

    var a:array[1..100] of integer;

    i,j,k,l,m:longint;

    m1,m2:longint;

    max:longint;

    procedure s1(v1,v2:longint);

    var q2:array[1..100] of longint;

    ii,jj,kk,mm:longint;

    begin

    fillchar(q2,sizeof(q2),0);

    ii:=0;jj:=0;kk:=0;mm:=0;

    for ii:=1 to v2 do q2[ii]:=1;

    for ii:=v2-1 downto v1 do

    begin

    mm:=0;

    for jj:=ii+1 to v2 do if (a[ii]a[jj]) and (mmm2 then m2:=q2[ii];

    end;

    begin

    readln(m);

    for i:=1 to m do read(a[i]);

    j:=0;

    for i:=1 to m do if a[i]>j then j:=a[i];

    for i:=1 to m do

    begin

    s1(1,i);

    s2(i,m);

    if m1+m2-1>max then begin max:=m1+m2-1;{writeln(max,' ',a[i],' ',m1,' ',m2);}end;

    end;

    writeln(m-max);

    end.

  • 0
    @ 2009-09-20 11:14:08

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    终于ac了

    看我的巨长型程序,都不知道我自己怎么写出来的

    program p1098;

    var

    f1,f2:array[0..100,130..230] of integer;

    a1,a2,max:array[0..100]of integer;

    max1,max2,max11,max21:array[0..100,1..2] of integer;

    n:integer;

    procedure init;

    var

    i:integer;

    begin

    readln(n);

    for i:=1 to n do

    begin

    read(a1[i]);

    a2[n-i+1]:=a1[i];

    end;

    end;

    procedure main;

    var

    i,j:integer;

    begin

    for i:=1 to n do

    begin

    f1:=1;

    for j:=1 to n do

    begin

    if f1[i,a1[j]]

  • 0
    @ 2009-09-19 17:11:02

    #include

    using namespace std;

    int a[101],up[101],down[101];

    int getUp(int i)

    {

      int j,p=0;

      for(j=i-1;j>=0;j--)

       if(a[i]>a[j]&&up[j]>p)

       p = up[j];

       return p;

    }

    int getDown(int i)

    {

      int j,max=0;

      for(j=i-1;j>=0;j--)

      {

           if(a[i]max)

                max = up[j];

               if(down[j]>max)

                max = down[j];

               }

            }

    return max;

    }

    int main()

    {

      int i,n,t=up[0]=down[0]=1;

      cin>>n;

      cin>>a[0];

      for(i=1;i>a[i];

      up[i]=getUp(i)+1;

      if(up[i]>t)

      t=up[i];

      down[i]=getDown(i)+1;

      if(down[i]>t)

      t=down[i];

      }

      cout

  • 0
    @ 2009-09-18 19:39:04

    一星半纪念~~

    O(∩_∩)O~

  • 0
    @ 2009-09-18 17:43:07

    详细的解题报告

    可读性强的程序

    http://wwzhwdwd.blog.163.com/blog/static/128151450200981854230562

  • 0
    @ 2009-09-18 17:26:59
  • 0
    @ 2009-09-14 16:30:01

    #include

    using namespace std;

    int a[101],up[101],down[101];

    int getUp(int i)

    {

      int j,p=0;

      for(j=i-1;j>=0;j--)

       if(a[i]>a[j]&&up[j]>p)

       p = up[j];

       return p;

    }

    int getDown(int i)

    {

      int j,max=0;

      for(j=i-1;j>=0;j--)

      {

           if(a[i]max)

                max = up[j];

               if(down[j]>max)

                max = down[j];

               }

            }

    return max;

    }

    int main()

    {

      int i,n,t=up[0]=down[0]=1;

      cin>>n;

      cin>>a[0];

      for(i=1;i>a[i];

      up[i]=getUp(i)+1;

      if(up[i]>t)

      t=up[i];

      down[i]=getDown(i)+1;

      if(down[i]>t)

      t=down[i];

      }

      cout

信息

ID
1098
难度
5
分类
动态规划 | LIS 点击显示
标签
递交数
12832
已通过
4890
通过率
38%
被复制
21
上传者