日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ural 1519. Formula 1 优美的插头DP

發(fā)布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ural 1519. Formula 1 优美的插头DP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天早上學了插頭DP的思想和最基礎(chǔ)的應(yīng)用,中午就開始敲了,岐哥說第一次寫不要看別人代碼,利用自己的理解一點點得寫出來,這樣才鍛煉代碼能力!于是下午慢慢地構(gòu)思輪廓,一點點地敲出主體代碼,其實是很磨蹭的,由于要考慮好多東西,而且昨晚2點睡的有點困,最后終于磨蹭出來了,第一次的代碼搓沒關(guān)系,自己寫的才重要。然后果然不出我所料,調(diào)試到了晚上才A了(一個郁悶的錯誤)。。。A的感覺真的是爽呀,雖然搞了差不多一天。當然自己寫了自己想的代碼后也要把代碼優(yōu)化,不然隊友看不懂自己代碼就囧了。。。


插頭DP,建議大家想學的好好看看陳丹琦的國家集訓隊論文,這是個優(yōu)美的DP。

http://www.docin.com/p-46797997.html


?

#include <stdio.h> #include <string.h>#define LL __int64const int mod = 10007;// 哈希表 struct HASH{int head[mod+10], E, next[80000];LL val[80000], cnt[80000];void init() {memset(head, -1, sizeof(head));E = 0;}int findhash(LL x) {return (x%mod + mod)%mod;}void add(LL x, LL sum) {int u = findhash(x);for(int i = head[u];i != -1;i = next[i]) if(val[i] == x) {cnt[i] += sum;return ;}val[E] = x;cnt[E] = sum;next[E] = head[u];head[u] = E++;}}biao1, biao2;int c[22], n, m, d[22]; // 編碼 void get(LL x) {for(int i = m+1;i >= 1; i--) {c[i] = x&7;x /= 8;} } // 解碼 LL getval() {LL ret = 0;for(int i = 1;i <= m+1; i++) {ret |= d[i];ret *= 8;}ret /= 8;return ret ; } // 轉(zhuǎn)化成最小表示法 void change() {int vis[22];memset(vis, 0, sizeof(vis));int num = 1;for(int i = 1;i <= m+1;i ++) {if(!d[i]) continue;if(!vis[d[i]]) {vis[d[i]] = num;d[i] = num++;}else {d[i] = vis[d[i]];}} }void fuzhi() {for(int i = 1;i <= m+1;i ++) d[i] = c[i]; }char s[22][22];int main() {int i, j, k, l;while(scanf("%d%d", &n, &m) != -1) {for(i = 1;i <= n; i++)scanf("%s", s[i]+1);int tot = 0;for(i = 1;i <= n; i++)for(j = 1;j <= m; j++)if(s[i][j] == '.') tot++;if(tot%2==1 || tot < 4) {puts("0");continue;}int tox = -1, toy = -1;for(i = 1;i <= n; i++)for(j = 1;j <= m; j++) if(s[i][j] == '.') {tox = i;toy = j;}biao1.init();biao1.add(0, 1);LL ans = 0;for(i = 1;i <= n; i++){for(j = 0;j <= m; j++){biao2.init();for(l = 0;l < biao1.E; l++) {get(biao1.val[l]);if(j == m) {for(int ii = 2;ii <= m+1; ii++) d[ii] = c[ii-1];d[1] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);continue;}if(c[j+1] && !c[j+2]) { // 有左插頭無上插頭if(s[i][j+1] != '.') continue;if(j+2 <= m) {fuzhi();d[j+1] = 0;d[j+2] = c[j+1];change();LL now = getval();biao2.add(now, biao1.cnt[l]);}if(i < n) {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else if(!c[j+1] && c[j+2]) { // 有上插頭無左插頭if(s[i][j+1] != '.') continue;if(i < n) {fuzhi();d[j+1] = c[j+2]; d[j+2] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}if(j+2 <= m) {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else if(!c[j+1] && !c[j+2]) { // 左和上都無插頭if(s[i][j+1] != '.') {fuzhi();change();LL now = getval();biao2.add(now, biao1.cnt[l]);continue;}if(j+2 <= m && i < n) {fuzhi();d[j+1] = d[j+2] = 13;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}else { //  左和上都有插頭 ,  要判斷左和上插頭是否連通if(c[j+2] == c[j+1]) {int tot = 0;for(int ii = 1;ii <= m+1; ii++) if(c[ii])tot++;if(tot == 2 && i == tox && j+1 == toy) ans += biao1.cnt[l];}else {if(s[i][j+1] != '.') continue;fuzhi();for(int ii = 1;ii <= m+1; ii++) if(ii != j+1 && ii != j+2 && d[ii] == d[j+1]) {d[ii] = d[j+2];break;}d[j+1] = d[j+2] = 0;change();LL now = getval();biao2.add(now, biao1.cnt[l]);}}}biao1 = biao2;}}printf("%I64d\n", ans);}return 0; }


?


?

轉(zhuǎn)載于:https://www.cnblogs.com/jiangu66/p/3236833.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的Ural 1519. Formula 1 优美的插头DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。