vijos p1098(合唱队形)

好吧刚开始学DP,DP应该是确保每个子结构是最优的,递推式貌似很重要,想到递推式的话,程序实现应该不会很难。

这道题的思想是:求以每一个点为终点的最长上升子序列和最长下降子序列,最后的序列即使每一个点的上升序列和下降序列之和减一 的最大值,

ANS即为 N-最大值。

代码:

 1 program p1098;
 2 var
 3         a:array[0..200] of longint;
 4         up,down,ans:array[0..200] of longint;
 5         i,j,k,l,m,n,max:longint;
 6 begin
 7         read(n);
 8         for i:=1 to n do
 9                 begin
10                 read(a[i]);
11                 end;
12         for i:=1 to n do
13                 up[i]:=1;
14         for i:=1 to n do
15                 down[i]:=1;
16         for i:=2 to n do
17              for j:=0 to i-1 do
18                  if (a[i]>a[j])and(up[j]+1>up[i]) then up[i]:=up[j]+1;
19         for i:=n-1 downto 1 do
20                 for j:=n downto i+1 do
21                 if (a[i]>a[j])and(down[j]+1>down[i]) then down[i]:=down[j]+1;
22         for i:=1 to n do
23         begin
24                  ans[i]:=up[i]+down[i]-1;
25                  if m<ans[i] then m:=ans[i];
26         end;
27         write(n-m);
28 end. 
posted @ 2012-10-12 21:07  改名字干什么  阅读(183)  评论(0编辑  收藏  举报