zoukankan      html  css  js  c++  java
  • 【刷题】【dp】小a和uim之大逃离

    地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液。

    怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束。

    开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收。

    魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推。

    怪物还说道,最后谁的魔瓶装的魔液多,谁就能活下来。小a和uim感情深厚,情同手足,怎能忍心让小伙伴离自己而去呢?沉默片刻,小a灵机一动,如果他俩的魔瓶中魔液一样多,不就都能活下来了吗?小a和他的小伙伴都笑呆了!

    将k+1,然后直接mod,得到的就是0-k

    规定0操作为加,1操作为减,每次状态为两者的差

    推出方程:

    f[i][j][p][0]+=f[i-1][j][(p-mapp[i][j]+k)%k][1] (i-1>=1)

    f[i][j][p][0]+=f[i][j-1][(p-mapp[i][j]+k)%k][1] (j-1>=1)

    f[i][j][p][1]+=f[i-1][j][(p+mapp[i][j])%k][0] (i-1>=1)

    f[i][j][p][1]+=f[i][j-1][(p+mapp[i][j])%k][0] (j-1>=1)

    因为可以从任何状态开始,任何状态结束,所以从(1,1)->(n,m),

    最后求(1,1)->(n,m)方案数总和

    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int n,m,p,t;
    const int N=803,P=18,mod=1000000007;
    int d[N][N];
    int f[N][N][P][2],ans;//0先手,1后手 
    
    int main()
    {
        scanf("%d%d%d",&n,&m,&p);
        p++;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&d[i][j]);
                f[i][j][d[i][j]%p][0]=1;
            }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int k=0;k<p;k++)
                {
                    if(j>1)
                        f[i][j][k][1]=(f[i][j][k][1]+f[i][j-1][(k+d[i][j]+p)%p][0])%mod,
                        f[i][j][k][0]=(f[i][j][k][0]+f[i][j-1][(k-d[i][j]+p)%p][1])%mod; 
                    if(i>1)
                        f[i][j][k][1]=(f[i][j][k][1]+f[i-1][j][(k+d[i][j]+p)%p][0])%mod,
                        f[i][j][k][0]=(f[i][j][k][0]+f[i-1][j][(k-d[i][j]+p)%p][1])%mod; 
                }
        
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                ans=(ans+f[i][j][0][1])%mod;
        printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    mac的端口被占用
    php中的运算符、控制结构
    文档模式影响浏览器的渲染
    ubuntu 命令 tips 来自于 ubuntu中文论坛
    用好 Emacs 中的 register
    [转载] Rsync命令参数详解
    使用 python 遍历目录下的文件
    灵活的左移位( << )操作
    使用 iperf 测试两台机器间的最大带宽
    Emacs server 新启动方式 (仅在emacs daemon未启动时才启动daemon)
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11730117.html
Copyright © 2011-2022 走看看