luogu P1373 小a和uim之大逃離

2021-08-25 05:43:52 字數 983 閱讀 8229

這是一道求方案數的題。我很菜,不太會寫方案數的題,所以看了下題解,並寫下這篇部落格。

首先,我們是在乙個n*m的格仔裡走,有兩種走法,乙個是向右,乙個是向下。起點任意,終點任意。在你走的路徑上,第奇數個點是小a取走其中的液體,第偶數個點是uim取走其中的液體,必須走偶數個點。我們所要求的是,走到終點後,小a和uim的液體數一樣的路徑的方案數。

覺得題不好寫,主要是覺得需要限制的條件太多了。首先起點是什麼不知道,小a與uim的液體數量也得考慮進去。最開始不知道腦子哪抽了在想動態轉移方程,,這明擺著是個列舉所有方案的題,不過是我們用dp的思想優化遞推而已。至於起點,在最初給dp陣列賦值的時候考慮進去,每個點都當成起點。k(小a的液體),l(uim的液體)不好遞推下去,本來就不用遞推下去,直接把他們的值當做dp陣列的下標。那麼思路就清晰了,列舉i,j和k,l,然後把當前方案數加到可以移動的下乙個位置,每次當k==l的時候,ans加上當前的值,遞推下去就好了。

不過這道題n,m的範圍是800,k與l的範圍又是16,怎麼說複雜度都不過關。我們發現,當我們加答案給ans的時候,只考慮了k與l的差值。所以我們沒有必要列舉k與l的值,只需要列舉差值就可以,當然最後再加乙個維度儲存當前這個點由誰來取。遞推答案的時候,先列舉點i,j,然後列舉差值,向下擴充套件就可以了。複雜度為o(n*m*k)。

#includeusing namespace std;

const int mod=1000000007;

int ans,n,m,k,f[810][810][16][2],a[810][810];

int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

for(int h=0;hif(j+1<=m)

if(h==0)

ans=(ans+f[i][j][h][1])%mod;

}printf("%d\n",ans);

return 0;

}

Luogu P1373 小a和uim之大逃離

題目描述 傳送門 一看這題首先想到設d i,j,k1,k 2,0 表示在小a剛吸完i,j這個位置的魔液,小a和uim的魔瓶的魔液量分別為k1,k2時的方案數,d i,j,k1,k 2,1 表示在uim剛吸完 的方案數。但是這樣明顯會爆記憶體 於是我就一直卡著了。後來看到討論區有差這個字,才想到把狀態...

LUOGU P1373 小a和uim之大逃離 題解

小a和uim來到雨林中探險。突然一陣北風吹來,一片烏雲從北部天邊急湧過來,還伴著一道道閃電,一陣陣雷聲。剎那間,狂風大作,烏雲布滿了天空,緊接著豆大的雨點從天空中打落下來,只見前方出現了乙個披頭散髮 青面獠牙的怪物,低沉著聲音說 呵呵,既然你們來到這,只能活下來乙個!小a和他的小夥伴都驚呆了!瞬間,...

luogu P1373 小a和uim之大逃離

小a和uim來到雨林中探險。突然一陣北風吹來,一片烏雲從北部天邊急湧過來,還伴著一道道閃電,一陣陣雷聲。剎那間,狂風大作,烏雲布滿了天空,緊接著豆大的雨點從天空中打落下來,只見前方出現了乙個披頭散髮 青面獠牙的怪物,低沉著聲音說 呵呵,既然你們來到這,只能活下來乙個!小a和他的小夥伴都驚呆了!瞬間,...