vijos p1038 新增括號(石子合併)

2022-06-02 20:27:08 字數 2336 閱讀 5421

一道動態規劃的題目。

區間動規?我不知道......

第一次接觸這種型別的動規,區間動規吧...

就是石子合併。

方程:f[

i,j] = min。

我們可以用遞推的方法實現它,但是如何遞推是個問題。

自然而然地,先求得長度為1的區間,然後是長度為2的區間,然後3.....

至於添括號的方法和各個中間和,我們可以用兩個字串陣列來處理他們。

具體看**:

1 program p1038; uses math;

2 var

3 i,j,k,l,m,n,ans:longint;

4 s:array[0..30]of longint;

5 st:string;

6 c,d,f:array[0..30,0..30]of longint;

7 st1,st2:array[0..30,0..30]of string;

8 18 begin

19 assign(input,'p1038.in');

20 reset(input);

21 fillchar(c,sizeof(c),0);

22 fillchar(f,sizeof(f),0);

23 read(n);

24 for i:=1 to n do read(s[i]);

25 for i:=1 to n do

26 for j:=1 to i-1 do

27 for l:=j to i do

28 c[j,i]:=c[j,i]+s[l];

29 for i:=1 to n do

30 c[i,i]:=s[i];

31 for i:=1 to n do

32 for j:=1 to n do

33 f[i,j]:=maxlongint;

34 for i:=1 to n do

35 f[i,i]:=0;

36 for i:=1 to n do

37 str(s[i],st2[i,i]);//對中間和預處理

38 for i:=1 to n-1 do

39 for j:=1 to n-i do

40 for k:=j to j+i-1 do

41 begin

42 if f[j,j+i]>=f[j,k]+f[k+1,j+i]+c[j,j+i] then

43 begin

44 str(c[j,j+i],st);

45 st1[j,j+i]:=st1[j,k]+st1[k+1,j+i]+' '+st;//各個中間和

46 st2[j,j+i]:='('+st2[j,k]+'+'+st2[k+1,j+i]+')';//添括號的方法

47 end;

48 f[j,j+i]:=min(f[j,j+i],f[j,k]+f[k+1,j+i]+c[j,j+i]);

49 end;

50 writeln(st2[1,n]);

51 writeln(f[1,n]);

52 delete(st1[1,n],1,1);

53 writeln(st1[1,n]);

54 close(input);

55 end.

10 3 範圍驗證

rangevalidator控制項能夠驗證使用者輸入的值在乙個指定的範圍之內。如果使用者輸入的值不在該範圍之內,則顯示提示資訊。rangevalidator控制項提供了5種範圍,由type屬性指定。該屬性的值的具體描述如下 string,字串範圍 integer,整數範圍 double,實數範圍 d...

VIJOS P1037 搭建雙塔

2001年9月11日,一場突發的災難將紐約世界 中心大廈夷為平地,mr.f曾親眼目睹了這次災難。為了紀念 9?11 事件,mr.f決定自己用水晶來搭建一座雙塔。mr.f有n塊水晶,每塊水晶有乙個高度,他想用這n塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,mr.f可以從這n塊水晶中任取m 1 m...

VIJOS P1617 超級教主

lhx教主很能跳,因為orz他的人太多了。教主跳需要消耗能量,每跳1公尺就會消耗1點能量,如果教主有很多能量就能跳很高。教主為了收集能量,來到了乙個神秘的地方,這個地方凡人是進不來的。在這裡,教主的正上方每100公尺處就有乙個能量球 也就是這些能量球位於海拔100,200,300 公尺處 每個能量球...