1. 程式人生 > >P1879 [USACO06NOV]玉米田Corn Fields 狀壓dp

P1879 [USACO06NOV]玉米田Corn Fields 狀壓dp

alt .org 並不是 技術分享 就會 技術 {} har img

鏈接在此!

正解:狀壓dp(emm……據說插頭dp也可以趴但我不管!!!不會!!!

解題報告:

……我真的太菜了……我以為一個小時前要搞完的題目調錯誤調了一個小時……90分到100我差不多搞了一個小時……

然後這題還是做過的……就很氣,覺得確實是要搞下博客沒事兒復習下不然做過的題目還花倆小時我真的哭死……

先放上錯誤的90分代碼講一下錯哪兒了(因為……其實100並不難是可以想到的……沒有太大講的意義,主要我太菜了所以才會搞這麽久TT

技術分享圖片點我♂看♂沙雕靈巧在線WA題

然後錯誤的點是最後一個點RE,開大點兒就MLE。

來考你一下,這個程序錯哪兒了?

技術分享圖片
不知道你發現了沒有
就是當j和k可以滿足我那個判斷的時候,我的同一個ztk會被加進去很多次!然後[0]那個計數菌就會變得很大很大!然後它就死了!!!明白了嘛!!!
其實並不是代碼只是想折疊下quq

於是我修改了一下,判了下重,就光榮地WA了,還從90降到了30QAQ爆哭QAQ

哭到一半!我突然就!靈光一現!!!就想出來正解!!!就是其實f那個數組是不要開的……你484有點傻……

好然後就放代碼趴其實沒有改太多並不是很難嘛(……對著你做了兩小時的程序你再說一遍這句話???

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(ll i=x;i<=y;i++)
#define rl register ll
ll zt[(1<<15)+50]={},ok[15]={},cnt,dp[15][(1<<15)+50],ans;
ll read()
{
    char ch=getchar();ll x=0;bool y=1;
    while(ch!=- && (ch>
9 || ch<0))ch=getchar(); if(ch==-)y=0,ch=getchar(); while(ch>=0 && ch<=9)x=(x<<1)+(x<<3)+(ch^0),ch=getchar(); return y?x:-x; } int main() { ll m=read(),n=read(); rp(i,0,(1<<n)-1) if((i&(i<<1))==0 && (i&(i>>1))==0) zt[++cnt]=i; rp(i,1,m) rp(j,1,n) { char ch=getchar(); while(ch!=1 && ch!=0)ch=getchar(); if(ch==1)ok[i]=ok[i]|(1<<(n-j)); } rp(i,1,cnt)if((ok[1]&zt[i])==zt[i])dp[1][zt[i]]=1; rp(i,2,m) rp(k,1,cnt) rp(j,1,cnt) if(((ok[i]&zt[k])==zt[k]) && ((zt[k] & zt[j])==0)) dp[i][zt[k]]=(dp[i][zt[k]]+dp[i-1][zt[j]])%100000000; rp(i,1,cnt)ans=(ans+dp[m][zt[i]])%100000000; printf("%lld",ans); return 0; }
點♂我♂在線膜拜hl大佬

好的那麽這次題解只寫了十分鐘! 我hin滿意!以後寫題解也不要扯廢話浪費時間!over!

P1879 [USACO06NOV]玉米田Corn Fields 狀壓dp