又做出一道題目了

2021-07-01 21:33:09 字數 1436 閱讀 5945

不得不說今天早上的收穫真大,三道dp了~

下面是我寫的題解:

題目:串的記數

問題編號:38

乙個長度為3n字串滿足:由n

個a,n

個b,n

個c組成,對於它的任意字首,滿足a

的個數》=b的個數》=c

的個數。求滿足這樣條件的字串的個數。

資料範圍:

10%的資料滿足0<=n<=5

100%的資料滿足0<=n<=60

輸入檔案只有一行,為1個整數n(0<=n<=60)。

所求的答案

這道題目很早以前就看到了。但是狀態沒設計好,一直沒做出來,看了一下別人的狀態,發現是三維的f[i,j,k]表示用i個a,j個b,k個c組成的滿足條件的穿的個數。而我一開始想的狀態是一維的f

表示長度為i的字串的個數。。。。。。這個不能轉移,哎。然後這道題目也不是純dp,還包含了高精度在裡面。我寫的是定義型別和運算子過載,但是沒壓位。一開始陣列長度開成了60,爆掉了。然後改大點就過了。汗~

下面是高精度的**:

const maxn=60;maxm=1000;

type node=array[0..maxm]of int;

operator +(a,b:node)c:node;

var i:int;

begin

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

c[0]:=max(a[0],b[0]);

fori:=1 to c[0] do

begin

c:=c+a+b;

c[i+1]:=c[i+1]+c div 10;

c:=cmod 10;

end;

while(c[c[0]+1]>0)doinc(c[0]);

end;

然後就是dp了~,既然狀態對了,那麼轉移就簡單了。f[i,j,k]:=f[i-1,j,k]+f[i,j-1,k]+f[i,j,k-1];這個轉移是一維的,灰常好寫~這個dp~我還是寫的記憶化搜尋。(汗,這麼喜歡記憶化搜尋?)下面是**:

function search(a,b,c:node):node;

begin

if(aif(aif(bif(f[a,b,c][0]>0)thenexit(f[a,b,c]);

f[a,b,c]:=f[a,b,c]+search(a-1,b,c);

f[a,b,c]:=f[a,b,c]+search(a,b-1,c);     

f[a,b,c]:=f[a,b,c]+search(a,b,c-1);

exit(f[a,b,c]);

end;

然後初始條件就是:f[1,0,0][1]:=1;f[1,0,0][0]:=1;

主程式就是一句話:f[n,n,n,]:=search(n,n,n);

輸出就是:f[n,n,n] 要用高精度輸出。。。。(討厭壓位~);

一道this的題目

請問下面 中的this值指向的是全域性物件還是物件o?function f return c var o new f console.log o.constructor.name object這裡的this指向全域性物件,因為 c call without new。這裡用正常的方式呼叫的函式 c 所...

一道題目 intel

從序列中找四個四字子串形成十進位制數使之乘積最大 就是求四個最大的?我目前只想到如下辦法。這個題並不是關於複雜的演算法,其本意是要利用並行處理,但目前尚未考慮到 除了其中比較求最小值部分有希望用simd include int g teststring int main void int picke...

一道題目 移位

csdn上一道面試題 十進位制整數,計算對應的二進位制數包含多少個1,用位操作。int n 95625 int m 1 int num 0 for int i 0 i sizeof int 8 i cout num endl 讓1不斷移位去判斷與其對應位置是否為1 若是有符號整數 負數 原碼的補碼 ...