您的位置:首页 > 其它

动规基础题目

2015-02-02 19:24 176 查看
【动态规划基础】数字三角形(IOI1994)
Time Limit:10000MS 
Memory Limit:65536KTotal Submit:77 Accepted:46

Description
数字三角形

Input
Output
Sample
Input







Sample
Output


 

可以送上往下推(f[I,j]:=max(f[i-1,j-1],f[I-1,j])),也可以从下往上推(f[I,j]:=f[i+1,j],f[i+1,j+1])
 


var a:array[0..100,0..100]of longint; n,i,j,m:longint;


function max(x,y:longint):longint;begin if x>y then max:=x        else max:=y;end;


begin read(n); for i:=1 to n do  for j:=1 to i do   read(a[i,j]); for i:=n-1 downto 1 do  for j:=1 to i do   a[i,j]:=a[i,j]+max(a[i+1,j+1],a[i+1,j]);  writeln(a[1,1]);end.

 



Time Limit:10000MS  Memory Limit:65536KTotal Submit:43 Accepted:26









6 3
1
1
0
1
0
1

 



2

 

 var s0,s1,n,m,i,j,k:longint; a:array[1..1000]of longint; p:array[0..500,0..500]of longint; f:array[0..500]of longint;function min(x,y:longint):longint;begin if x<=y then min:=1        else min:=2;end;begin read(n,m); for i:=1 to n do  read(a[i]); for i:=1 to n do  for j:=i+1 to n do   begin   s0:=0;   s1:=0;   for k:=i to j do    if a[k]=0 then inc(s0)              else inc(s1);   p[i,j]:=s0*s1;  end;  f:=p[1];  for i:=2 to m do   for j:=n downto 1 do    for k:=i to j-1 do     if f[k]+p[k+1,j]<f[j] then f[j]:=f[k]+p[k+1,j];  writeln(f
);end. Time Limit:10000MS  Memory Limit:65536KTotal Submit:72 Accepted:35




     var tt,n,i,j:longint; t,v,f:array[0..100]of longint;begin read(tt,n); for i:=1 to n do  read(t[i],v[i]); for i:=1 to 100 do  f[i]:=1000; for i:=1 to n do for j:=100 downto v[i] do  if f[j-v[i]]+t[i]<f[j] then f[j]:=f[j-v[i]]+t[i]; for j:=100 downto 1 do  if f[j]<=tt then begin writeln(j); exit; end;end.  Time Limit:10000MS  Memory Limit:65536KTotal Submit:69 Accepted:32 




        


var i,j,n,k,l,min:longint; f,m:array[1..500,1..500]of longint; a:array[1..500]of longint;begin read(n); for i:=1 to n do read(a[i]); for i:=1 to n do  for j:=1 to n do   for k:=i to j do    m[i,j]:=m[i,j]+a[k]; for i:=0 to n-1 do  for j:=1 to n-i do   begin   min:=maxlongint;   for k:=j to j+i-1 do    if f[j,k]+f[k+1,j+i]<min then min:=f[j,k]+f[k+1,j+i];   if min=maxlongint then min:=0;   f[j,j+i]:=min+m[j,j+i];  end;  write(f[1,n]-m[1,n]);end.

Time Limit:10000MS  Memory Limit:65536KTotal Submit:97 Accepted:40 


 

 


var n,k,xk,i,j:longint; f:array[0..10000]of longint; v,P:array[1..200]of longint;begin read(n,xk); for i:=1 to n do  read(v[i],p[i]);

 for i:=1 to n do  for k:=1 to xk div v[i] do   for j:=xk downto v[i]*k do    if f[j-v[i]*k]+p[i]*k>f[j] then     f[j]:=f[j-v[i]*k]+p[i]*k; write(f[xk]);end.

 

 



Time Limit:10000MS  Memory Limit:655360KTotal Submit:113 Accepted:34









5
Ab3bd

 



2

 

 

是“公共子序列”问题变形,读入S1,把S1首尾调换变为S2,求S1和S2的公共子序列数L,结果为length(s1)-l;

 


var n:longint; s1,s2:ansistring; f:array[0..500,0..500]of longint;


procedure init;var i,j:longint; c:char;begin readln(n); readln(s1); for i:=1 to n do  s2:=s1[i]+s2;end;


procedure main;var i,j,s:longint;


begin fillchar(f,sizeof(f),0); for i:=1 to n do  for j:=1 to n do   begin   if s1[i]=s2[j] then f[i,j]:=f[i-1,j-1]+1;   if f[i-1,j]>f[i,j] then f[i,j]:=f[i-1,j];   if f[i,j-1]>f[i,j] then f[i,j]:=f[i,j-1];   end; write(n-f[n,n]);end;


begin init; main;end.
(poj1458)

[align=left] [/align]给出两个字符串,求最长公共子序列(被两个字符串同时按顺序拥有)   设一个二维数组,横代表第一个字符串s1,纵代表第二个字符串s2,f[I,j]代表到s1[i],s2[j]
时最长公共子序列长度if s1[i]=s2[i] then
f[I,j]:=f[i-1,j-1]+1
Else
f[I,j]:=max(f[I,j-1],f[i-1,j]);
想要copy某字符串的第i位到最后一位,可以这样写copy(s,I,length(s))
 


var s,s1,s2:ansistring; i,j,m:longint;


function max(x,y:longint):longint;begin if x>y then max:=x        else max:=y;end;


procedure main;var i:longint; a:array[0..100,0..100]of longint;begin fillchar(a,sizeof(a),0) ; for i:=1 to length(s1) do  for j:=1 to length(s2) do   if s1[i]=s2[j] then a[i,j]:=a[i-1,j-1]+1                  else a[i,j]:=max(a[i-1,j],a[i,j-1]); writeln(a[length(s1),length(s2)]);end;


begin while not eof do  begin   m:=0;   readln(s);   for i:=1 to length(s) do    begin     if s[i]=#9 then s[i]:=' ';     if s[i]=#10 then s[i]:=' ';     if s[i]=#13 then s[i]:=' ';    end;   i:=pos(' ',s);   s1:=copy(s,1,i-1);   s2:=copy(s,i+1,length(s));   main;  end;end.

Time Limit:10000MS  Memory Limit:65536KTotal Submit:24 Accepted:14




Source 
01背包。
但一开始却写错了。。
WA程序: const w:array[1..6]of longint=(1,2,3,5,10,20);var n,i,j,s,k:longint; f:array[0..1000]of boolean; a:array[1..6]of longint;begin n:=6; for i:=1 to n do read(a[i]); fillchar(f,sizeof(f),0); f[0]:=true; for i:=1 to n do  for j:=1 to a[i] do   for k:=1000 downto
j*w[i]  do   if
f[k-j*w[i]] then f[k]:=true; s:=0; for i:=1 to 1000 do  if f[i] then inc(s); writeln(s);end.    
AC程序:const w:array[1..6]of longint=(1,2,3,5,10,20);var n,i,j,s,k:longint; f:array[0..1000]of boolean; a:array[1..6]of longint;begin n:=6; for i:=1 to n do read(a[i]); fillchar(f,sizeof(f),0); f[0]:=true; for i:=1 to n do  for j:=1 to a[i] do   for k:=1000 downto
w[i]  do   if f[k-w[i]]
then f[k]:=true; s:=0; for i:=1 to 1000 do  if f[i] then inc(s); writeln(s);end.  
程序中黑体字确实是个很容易错的地方。而且小数据测不出来。。。
多多注意!!     【动态规划基础】求最大连续子序列和
Time Limit:10000MS  Memory
Limit:65536KTotal Submit:144 Accepted:43
Description
  有一个整数数列,求一个连续子序列,使得子序列的和最大。Input
  第一行,n {表示该数列有n个整数,n
<= 10000 }  第二行,n个整数(integer类型),每个整数之间有一个空格。Output
  一行,一个值,最大连续子序列和(结果保证在正负
2^31 之间)。Sample
Input


Sample
Output


Source解题方法很水,但却没想到。
[align=left]具体看程序吧。[/align]
[align=left]注意,max赋值要为-maxlongint。因为会有和为负数。[/align]
[align=left] [/align]
var n,i,max:longint; a:array[1..100000+1]of longint;begin read(n); for i:=1 to n do read(a[i]); for i:=2 to
n do  if a[i-1]+a[i]>a[i] then
a[i]:=a[i-1]+a[i]; max:=-maxlongint; for i:=1 to n do  if a[i]>max then
max:=a[i]; write(max);end.[align=left] [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: