思路:首先給小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吸收,如此交替下去,並且要求最後一步必須由...