P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp

时间:2023-03-10 02:31:07
P1879 [USACO06NOV]玉米田Corn Fields  状压dp/插头dp

正解:状压dp/插头dp

解题报告:

链接!

……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时……

然后这题还是做过的……就很气,觉得确实是要搞下博客没事儿复习下不然做过的题目还花俩小时我真的哭死……

先放上错误的90分代码讲一下错哪儿了(因为……其实100并不难是可以想到的……没有太大讲的意义,主要我太菜了所以才会搞这么久TT

点我♂看♂沙雕灵巧在线WA题

然后错误的点是最后一个点RE,开大点儿就MLE。

来考你一下,这个程序错哪儿了?

不知道你发现了没有
就是当j和k可以满足我那个判断的时候,我的同一个ztk会被加进去很多次!然后[]那个计数菌就会变得很大很大!然后它就死了!!!明白了嘛!!!

其实并不是代码只是想折叠下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[(<<)+]={},ok[]={},cnt,dp[][(<<)+],ans;
ll read()
{
    ;;
    '))ch=getchar();
    ,ch=getchar();
    )+(x<<)+(ch^'),ch=getchar();
    return y?x:-x;
}
int main()
{
    ll m=read(),n=read();
    rp(i,,(<<n)-)
        ))== && (i&(i>>))==)
            zt[++cnt]=i;
    rp(i,,m)
        rp(j,,n)
        {
            char ch=getchar();
            ')ch=getchar();
            <<(n-j));
        }
    rp(i,,cnt)]&zt[i])==zt[i])dp[][zt[i]]=;
    rp(i,,m)
        rp(k,,cnt)
            rp(j,,cnt)
                ))
                    dp[i][zt[k]]=(dp[i][zt[k]]+dp[i-][zt[j]])%;
    rp(i,,cnt)ans=(ans+dp[m][zt[i]])%;
    printf("%lld",ans);
    ;
}

这儿是code!