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.