vijos p1061(迎春舞会之三人组舞)

这道题.....感觉很难,主要是我觉得很难弄出方程式;

方程式为f[i,j]=min(f[i-2,j-1]+s[i,j],f[i-1,j]);

表示第j组到第i个人的残疾指数的最小值。

注意每次for 次数的时候,直接for 到 i div 3就可以了,之后就没有意义了。

 1 program P1061;  uses math;
 2 var
 3         i,j,k,l,m,n,x:longint;
 4         s:array[1..5500] of longint;
 5         f:array[-1..5500,0..2000] of longint;
 6 begin
 7         {assign(input,'haha.in');
 8         reset(input);}
 9         read(m,n);
10         for i:=n downto 1 do
11                 read(s[i]);
12         close(input);
13         for j:=1 to m do
14                 for i:=1 to n do
15                         f[i,j]:=maxlongint;
16         for i:=1 to n do
17                 for j:=1 to i div 3 do
18                         begin
19                         f[i,j]:=min(f[i-2,j-1]+sqr(s[i]-s[i-1]),f[i-1,j]);
20                         end;
21         x:=maxlongint;
22         for i:=1 to n do
23                       if x>f[i,m] then x:=f[i,m];
24         write(f[n,m]);
25 end.    
posted @ 2012-10-18 08:53  改名字干什么  阅读(233)  评论(0编辑  收藏  举报