zoukankan      html  css  js  c++  java
  • P1373 小a和uim之大逃离 二维dp

      

    题目背景

    小a和uim来到雨林中探险。突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声。刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个披头散发、青面獠牙的怪物,低沉着声音说:“呵呵,既然你们来到这,只能活下来一个!”。小a和他的小伙伴都惊呆了!

    题目描述

    瞬间,地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等量的魔液。怪物各给了小a和uim一个魔瓶,说道,你们可以从矩阵的任一个格子开始,每次向右或向下走一步,从任一个格子结束。开始时小a用魔瓶吸收地面上的魔液,下一步由uim吸收,如此交替下去,并且要求最后一步必须由uim吸收。魔瓶只有k的容量,也就是说,如果装了k+1那么魔瓶会被清空成零,如果装了k+2就只剩下1,依次类推。怪物还说道,最后谁的魔瓶装的魔液多,谁就能活下来。小a和uim感情深厚,情同手足,怎能忍心让小伙伴离自己而去呢?沉默片刻,小a灵机一动,如果他俩的魔瓶中魔液一样多,不就都能活下来了吗?小a和他的小伙伴都笑呆了!

    现在他想知道他们都能活下来有多少种方法。

    输入输出格式

    输入格式:

    第一行,三个空格隔开的整数n,m,k

    接下来n行,m列,表示矩阵每一个的魔液量。同一行的数字用空格隔开。

    输出格式:

    一个整数,表示方法数。由于可能很大,输出对1 000 000 007取余后的结果。

    输入输出样例

    输入样例#1: 复制
    2 2 3
    1 1
    1 1
    
    输出样例#1: 复制
    4

    看起来很复杂 但是递推式其实很简单
    状态主要有 i行 j列 s容量 01两个人谁拿
    注意取答案的时候的操作
    还有mod注意一下

    注意01下标时的加减

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 900
    const int mod =(int)1e9+7;
    int dp[N][N][20][2];
    int mp[N][N];
    
    int main()
    {
        int n,m,k;
        RIII(n,m,k);
        k++;
        rep(i,1,n)
        rep(j,1,m)
        RI(mp[i][j]),dp[i][j][mp[i][j]%k][0]=1;
    
        rep(i,1,n)
        rep(j,1,m)
        rep(s,0,k)
        {
            dp[i][j][s][0]+=(dp[i-1][j][(s-mp[i][j]+k)%k][1])%mod;
            dp[i][j][s][0]+=(dp[i][j-1][(s-mp[i][j]+k)%k][1])%mod;
    
            dp[i][j][s][1]+=(dp[i-1][j][(s+mp[i][j])%k][0])%mod;
            dp[i][j][s][1]+=(dp[i][j-1][(s+mp[i][j])%k][0])%mod;
        }
        ll cnt=0;
        rep(i,1,n)
        rep(j,1,m)
        {
            cnt=(cnt+dp[i][j][0][1])%mod;
        }
        
        cout<<cnt%mod;
    
        return 0;
    }






  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/bxd123/p/10720281.html
Copyright © 2011-2022 走看看