當前位置:編程學習大全網 - 編程語言 - 請教壹道信息學奧賽的pascal語言編程題

請教壹道信息學奧賽的pascal語言編程題

狀態壓縮DP,百度吃了空格,比較惡心,程序是我問人要的

var L,s,t,m,n,i,j,v,best:longint;

x:array [0..100] of longint;{由左而右記錄每個石子的位置}

a:array [0..100,0..9] of longint;{a[i,j]為青蛙跳到x[i]-j位置經過的最少石子數}

b:array [-10..90] of boolean;{b[i]記錄能否用s到t這t-s+1種距離從原點到達橫坐標為i的位置}

function can(v:longint):boolean;{判別青蛙能否跳到位置v}

begin

if v<0

then can:=false

else if v>=s*s-s{可以證明,當v≥s(s-1)時,壹定可以用s和s+1兩種跳躍距離到達位置v,所以要對s=t作特殊處理}

then can:=true

else can:=b[v]

end;{can}

begin

assign(input,'river.in');reset(input);{輸入文件讀準備}

readln(L);readln(s,t,m);{讀獨木橋長度、青蛙壹次跳躍的最小距離,最大距離和橋上的石子數}

for i:=1 to m do read(x[i]);{輸入每個石子在數軸上的位置}

readln; close(input);{關閉輸入文件}

for i:=1 to m-1 do{按照由左而右的順序排列石子}

for j:=1 to m-1 do

if x[j]>x[j+1] then begin v:=x[j];x[j]:=x[j+1];x[j+1]:=v end;{ then }

n:=m;while x[n]>L do dec(n);{去除獨木橋外的石子}

if s=t{若青蛙每次跳躍的距離唯壹,則青蛙過河最少需要踩到的石子數best即為坐標位置為s整倍數的石子數}

then begin

best:=0;

for i:=1 to n do if x[i] mod s=0 then inc(best);

assign(output,'river.out');rewrite(output);{輸出文件寫準備}

writeln(best); {輸出best後關閉輸出文件並成功退出}

close(output); halt

end;{ then }

fillchar(b,sizeof(b),false);

b[0]:=true;{計算小範圍的情況}

for i:=1 to 90 do{遞推每壹個坐標位置}

for j:=s to t do {枚舉青蛙壹次跳躍的可能距離,計算青蛙能否跳到坐標位置i}

b[i]:=b[i] or b[i-j];

for i:=0 to n do{狀態轉移方程初始化}

for j:=0 to t-1 do a[i,j]:=n+1;

x[0]:=0;{在0位置處增加壹個虛擬的石子}

a[0,0]:=0;{ 青蛙在0位置起跳}

for i:=1 to n do{遞推橋上的每壹個石子}

for j:=0 to t-1 do{枚舉每壹個可能的跳前位置}

if x[i]-j<=x[i-1]{如果x[i]-j位置位於石子i-1的左端}

then a[i,j]:=a[i-1,j-x[i]+x[i-1]]

else begin{若x[i]-j位置位於石子i-1的右端,則枚舉每壹個可能的跳前}

for v:=0 to t-1 do

if can(x[i]-j-x[i-1]+v) and (a[i-1,v]<a[i,j]) {若青蛙可以從x[i-1]-v跳到x[i]-j位置,且跳到x[i-1]-v位置經過的最少石子數為目前最少,則取跳到x[i-1]-v位置經過的最少石子數}

then a[i,j]:=a[i-1,v];

if j=0 then inc(a[i,j]){若踩到第I個石子,則經過的石子數+1}

end;{ else }

best:=n+1;

for i:=0 to t-1 do{枚舉青蛙跳出獨木橋前的最後壹個起跳位置,計算經過的石子數,從中找出最優解}

if a[n,i]<best then best:=a[n,i];

assign(output,'river.out');rewrite(output);{輸出文件寫準備}

writeln(best);{輸出最優解}

close(output){關閉輸出文件}

end.

  • 上一篇:人工智能的實現方法有哪些
  • 下一篇:北交所新能源與硬科技板塊迎來戴維斯雙擊,這12家公司值得關註
  • copyright 2024編程學習大全網