LOJ 10172 塗抹果醬

2022-05-27 10:45:11 字數 1369 閱讀 3313

思路:看到資料範圍,考慮狀壓$dp$。

發現每一格有$3$種情況,考慮用三進製來表示。

列舉所有情況,將可行解與其三進製建立對映關係。

由於第$k$行上下互不影響,我們可以分別進行$dp$,根據乘法原理相乘即可得到答案。

為了優化時間,我們可以先將可互相轉移的狀態記錄下來,$dp$時直接查詢即可。

**:

#include const

int maxm = 10050

;const

int p = 1000000

;typedef

intintt;

#define int long long

using

namespace

std;

vector

pb;mapmp;

bool c[1050][1050

];int n, m, k, num, ans1, ans2, res, x[maxm], f[maxm][50], g[maxm][50

];void init(int

x)

while(x /= 3

);

while(s.length() !=m)

s += '0'

; reverse(s.begin(), s.end());

for(int i = 1; i < (int)s.length(); i++)

pb.push_back(xx);

mp[xx] =s;

//cout << xx << " " << mp[xx] << endl;

}bool check(int x, int

y)

return

true;}

intt main()

res = res * 3 + (x[i] - 1

); }

for(int i = 0; i < (int)pow(3, m); i++)

//cout << a[k] << endl << mp[pb[num]] << endl;

for(int j = 0; j < (int)pb.size(); j++)

}f[k][num] = 1

;

for(int i = k - 1; i >= 1; i--) }}

g[k][num] = 1

;

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

for(int i = 0; i < (int)pb.size(); i++)

cout

<< (1ll * ans1 * ans2) % p

}

Loj10172 塗抹果醬

題目描述 tyvj 兩周年慶典要到了,sam 想為 tyvj 做乙個大蛋糕。蛋糕俯檢視是乙個 n m 的矩形,它被劃分成 n m 個邊長為 1 1 的小正方形區域 可以把蛋糕當成 nnn 行 mmm列的矩陣 蛋糕很快做好了,但光禿禿的蛋糕肯定不好看!所以,sam 要在蛋糕的上表面塗抹果醬。果醬有三種...

LOJ 10172 塗抹果醬 狀壓DP

題目描述 看完題目,很清楚的想到這道題用狀壓dp來做,只不過這道題是個三進製的,做題過程中須注意轉換。下面簡單說一下演算法 1.用0 1 2 來代替題目中的1 2 3這樣比較方便,將第k行以三進製數存入。先用乙個陣列存所以可行的狀態,若第k行的狀態不在陣列裡,直接輸出0.2.這道題中已經給出了一行的...

DP 塗抹果醬

紀念第乙個純自己寫的狀壓dp 感謝我的好友吳穎涵幫助除錯 流下了沒有技術的淚水 卡點 1.函式see1 see2中的for不能用while 關於0的處理 2.統計答案的迴圈意義review 3.萬年不變陣列範圍 首先陣列意義開範圍 include include include include in...