能量项链(NOIP2006)

deadrain 发表于 2007-08-16 23:44:45

用数组f[i,j]表示从第i个珠子到第j个珠子合并为一个珠子后,所释放的最大能量,用k表示断点。
状态转移方程为:f[i,j]:=max{ f[i,k]+f[k,j]+a[i]*a[k]*a[j]}

CODE:
-------------------------------------------
program p1312;
var
 a:array[1..100] of longint;
 f:array[0..100,0..100] of longint;
 i,j,k,t,v,u,n,max:longint;
begin
 readln(n);
 for i:=0 to n-1 do
  read(a[i]);
 fillchar(f,sizeof(f),0);
 for i:=2 to n do
 begin
  for j:=0 to n-1 do
  begin
   k:=(j+i) mod n;
   max:=0;
   for v:=j+1 to j+i-1 do
   begin
    u:=v mod n;
    t:=a[j]*a[u]*a[k]+f[j,u]+f[u,k];
    if t>max then max:=t;
   end;
   f[j,k]:=max;
  end;
 end;
 max:=0;
 for i:=0 to n-1 do
  if f[i,i]>max then max:=f[i,i];
 writeln(max);
end.
关键词(Tag): noip vijos
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

导弹拦截(NOIP1999)

deadrain 发表于 2007-08-16 23:19:02

题目略有改动,第一问即求最长下降子序列,第二问求最长升序子序列,要减1!

CODE:
-------------------------------------

program p1303;
var
 s:string;
 c:char;
 a:array[1..20] of integer;
 f:array[1..20] of longint;
 n,i,j,k:integer;
begin
 n:=0;s:='';
 while not eoln do
 begin
  read(c);
  if c=',' then
  begin
   inc(n);
   val(s,a[n],k);
   s:='';
  end
  else s:=s+c;
 end;
 inc(n);
 val(s,a[n],k);

 fillchar(f,sizeof(f),0);
 k:=1;f[n]:=1;
 for i:=n-1 downto 1 do
 begin
  f[i]:=1;
  for j:=i+1 to n do
   if (a[i]>a[j]) and (f[i]<f[j]+1) then f[i]:=f[j]+1;
  if f[i]>k then k:=f[i];
 end;
 write(k,',');

 fillchar(f,sizeof(f),0);
 k:=1;f[1]:=1;
 for i:=2 to n do
 begin
  f[i]:=1;
  for j:=i-1 downto 1 do
   if (a[j]<a[i]) and (f[i]<f[j]+1) then f[i]:=f[j]+1;
  if f[i]>k then k:=f[i];
 end;
 write(k-1);
end.

关键词(Tag): noip vijos
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

选数(NOIP2002)

deadrain 发表于 2007-08-15 21:56:13

easy! 的说~ ^^

CODE:
------------------------------------

program p1128;
var
 n,k,i,s:integer;
 a:array[1..20] of longint;

procedure judge(sum:longint);
var
 i:longint;
begin
 if sum<2 then exit;
 if sum>2 then
    for i:=2 to trunc(sqrt(sum)) do
     if sum mod i=0 then exit;
 inc(s);
end;

procedure search(st,k:integer;sum:longint);
var i:integer;
begin
 if k=0 then begin judge(sum);exit;end;
 for i:=st to n-k+1 do
  search(i+1,k-1,sum+a[i]);
end;

begin
 readln(n,k);
 for i:=1 to n do
  read(a[i]);
 s:=0;
 search(1,k,0);
 writeln(s);
end.

关键词(Tag): noip vijos
收藏: QQ书签 del.icio.us 订阅: Google 抓虾

FBI树(NOIP2004)

deadrain 发表于 2007-08-15 21:40:53

按照题述方法直接递归,一边构造一边输出。

CODE:
---------------------------------------------

program p1114;
var
 n:integer;
 s:ansistring;

procedure search(s:ansistring);
var
 l:integer;
 n0,n1:boolean;
begin
 l:=length(s);
 if l>1 then
 begin
  search(copy(s,1,l div 2));
  search(copy(s,l div 2+1,l div 2));
 end;
 if pos('0',s)<>0 then n0:=true else n0:=false;
 if pos('1',s)<>0 then n1:=true else n1:=false;
 if n0 and n1 then write('F')
    else if n0 then write('B')
            else write('I');
end;

begin
 readln(n);
 readln(s);
 search(s);
end.

关键词(Tag): noip vijos
收藏: QQ书签 del.icio.us 订阅: Google 抓虾