洛谷$P$1373 小$a$和$uim$之大逃離 $dp$


正解:$dp$

解題報告:

傳送門!

看到別的神仙在做就想着跟着做下$dp$的題目趴

然后發現還挺難的,,,反正我只大概想到怎么轉移但是初始化什么的都不會$TT$

所以還是大概說下$QAQ$

首先可以想到設$f[i][j][k]$表示小$a$走到$(i,j)$的位置,與$uim$毒液值相差$j$的方案數 $g$表示$uim$

然后大力轉移這里不難,大概寫下式子

$f[i][j][k]=(f[i][j][k]+g[i-1][j][(k-a[i][j]+v)%v])%mod$

$f[i][j][k]=(f[i][j][k]+g[i][j-1][(k-a[i][j]+v)%v])%mod;$

$g$同理不想寫了QwQ

關鍵在初始化,,,這個點反正我是沒想到的(,,,我$jio$得$dp$我最差的差不多就是初始化,,,所以我愛記搜

初始化是這樣的,首先看到這道題給的條件:

可以從任意一個格子開始,而且必須是小a開始

所以我們只用對小$a$的$f$初始化一下,$f[i][j][a[i][j]%v]=1$就好

哦還有一個小注意點還是港下,就是,思考一下第三維要不要開兩倍鴨

答案是不要,為什么呢,因為它都是在$mod\ v$意義下的,所以$-k=-k+v$,$get$?

沒啦!

最后計數算方案什么的還是挺簡單的?不想說了$QwQ$

# include <bits/stdc++.h>
using namespace std;
#define ll int
#define rg register
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)

const ll N=800+10,P=20,mod=1000000007;
ll f[N][N][P],g[N][N][P],as,n,m,p,fld[N][N];

inline ll read()
{
    rg ll x=0;rg bool y=1;rg char ch=getchar();
    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 ()
{
    n=read();m=read();p=read()+1;rp(i,1,n)rp(j,1,m)fld[i][j]=read()%p,f[i][j][fld[i][j]]=1;
    rp(i,1,n)
        rp(j,1,m)
        {
            rp(k,0,p-1)
            {
                f[i][j][k]=((f[i][j][k]+g[i][j-1][(k-fld[i][j]+p)%p])%mod+g[i-1][j][(k-fld[i][j]+p)%p])%mod;
                g[i][j][k]=((g[i][j][k]+f[i][j-1][(k+fld[i][j])%p])%mod+f[i-1][j][(k+fld[i][j])%p])%mod;
            }
            as=(as+g[i][j][0])%mod;
        }
    printf("%d\n",as);
    return 0;
}
這兒是代碼!

做完題之后上來$repo$一個神坑點,,,

你以為$v$就是膜數嘛,,,仔細看下題,,,$v+1$才是膜數啊,,,然后樣例還奇水無比我開始沒發現樣例也過了然后慘遭爆零$TT$

啊還有,,,就是,這題也不能開$ll$,會$MLE$昂,,,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM