洛谷OJ P1373 小a和uim之大逃離

2021-08-18 21:28:19 字數 1109 閱讀 3117

思路:首先給小uim改個名,叫他小b好了,那麼我們定義dp[i][j][k][0/1]為,在i,j點,小a小b的魔瓶差值為k,0代表小a吸收了這一格的魔液,1則是小b吸收了這一格的魔液,有幾種方法到達這種狀態。這個k坑了我好久。。由於小a與小b兩者魔瓶的差值可以為k,可是當k模k的時候得數卻是0,所以我們得讓k加1,開始陣列開小了也wa了好幾次。

通過定義的dp陣列我們可以得到遞推式

1.dp[i][j][l][0] = dp[i][j][l][0] + dp[i-1][j][(l-maps[i][j]+k)%k][1] + dp[i][j-1][(l-maps[i][j]+k)%k][1] 

2.dp[i][j][l][1] = dp[i][j][l][1] + dp[i-1][j][(l+maps[i][j])%k][0] + dp[i][j-1][(l+maps[i][j])%k][0] 

主要是第三維不好寫,我們設第三維應該填x,那麼1中的l%k=((a+maps)-b)%k,等價於 (l-maps)%k=(a-b)%k,所以1中的第三維填l-maps[i][j]+k)%k,+k主要是為了防止括號內為負數,2中l%k=(a-(b+maps))%k,等價於(l+maps)%k=(a-b)%k,所以2中的第三維填(l+maps[i][j])%k。那麼就可以編寫**了

#include #include #include #include using namespace std;

const int maxn = 800+2, mod = 1e9+7;

int n, m, k, dp[maxn][maxn][17][2], maps[maxn][maxn];

long long ans;

int main()

}/**********************************/

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

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

}cout << ans << endl;

return 0;

}

洛谷1373小a和uim之大逃離

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

洛谷 1373 小a和uim之大逃離

這道題狀態轉移方程是看題解才明白的 首先f i j p 0 1 表示在i,j的時候差值為p,最後一步是小a走為0,最後一步是uim走為1 至於為什麼乙個是減乙個是加,因為第一步是小a走的,所以uim走的時候是縮小差值,而小a走的時候是擴大差值,故乙個加乙個減 可以寫出狀態轉移方程 f i j p 0...

洛谷1373 小a和uim之大逃離

傳送門 題目描述 瞬間,地面上出現了乙個n m的巨幅矩陣,矩陣的每個格仔上有一坨0 k不等量的魔液。怪物各給了小a和uim乙個魔瓶,說道,你們可以從矩陣的任乙個格仔開始,每次向右或向下走一步,從任乙個格仔結束。開始時小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,並且要求最後一步必須由...