思路:看到資料範圍,考慮狀壓$dp$。
發現每一格有$3$種情況,考慮用三進製來表示。
列舉所有情況,將可行解與其三進製建立對映關係。
由於第$k$行上下互不影響,我們可以分別進行$dp$,根據乘法原理相乘即可得到答案。
為了優化時間,我們可以先將可互相轉移的狀態記錄下來,$dp$時直接查詢即可。
**:
#include constint 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...