• 洛谷 P1373 小a和uim之大逃离 题解


    每日一题 day30 打卡

    Analysis

    f[i][j][p][q]表示他们走到(i,j),且两人魔瓶内魔液量的差为p时的方法数。q=0表示最后一步是小a走的,q=1表示最后一步是uim走的。题目中说魔瓶的容量为k,实际上就是动归时p需要对k+1取余数,即p只有0~k,k+1种可能。答案为所有f[i][j][0][1]的和。

    动归方程如下:(为了方便已经令k=k+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)

    还有每个格子都有可能作为小a的起始格子,所以初始时对于所有i、j,f[i][j][mapp[i][j]][0]=1。

    算法复杂度o(n*m*k)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define maxn 800+10
     6 #define mod 1000000007
     7 using namespace std;
     8 inline int read() 
     9 {
    10     int x=0;
    11     bool f=1;
    12     char c=getchar();
    13     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    14     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    15     if(f) return x;
    16     return 0-x;
    17 }
    18 inline void write(long long x)
    19 {
    20     if(x<0){putchar('-');x=-x;}
    21     if(x>9)write(x/10);
    22     putchar(x%10+'0');
    23 }
    24 int n,m,k;
    25 int map[maxn][maxn];
    26 int dp[maxn][maxn][20][2];
    27 int main()
    28 {
    29     n=read();m=read();k=read();
    30     k++;
    31     for(int i=1;i<=n;i++)
    32         for(int j=1;j<=m;j++)
    33         {
    34             map[i][j]=read();
    35             dp[i][j][map[i][j]][0]=1;
    36         }
    37     long long ans=0;
    38     for(int i=1;i<=n;i++)
    39         for(int j=1;j<=m;j++)
    40             for(int p=0;p<=k;p++)
    41             {
    42                 dp[i][j][p][0]=(dp[i][j][p][0]+dp[i-1][j][(p-map[i][j]+k)%k][1])%mod;
    43                 dp[i][j][p][0]=(dp[i][j][p][0]+dp[i][j-1][(p-map[i][j]+k)%k][1])%mod;
    44                 dp[i][j][p][1]=(dp[i][j][p][1]+dp[i-1][j][(p+map[i][j])%k][0])%mod;
    45                 dp[i][j][p][1]=(dp[i][j][p][1]+dp[i][j-1][(p+map[i][j])%k][0])%mod;
    46             }
    47     for(int i=1;i<=n;i++)
    48         for(int j=1;j<=m;j++)
    49             ans=(ans+dp[i][j][0][1])%mod;
    50     write(ans);
    51     return 0;
    52 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    Python中的多线程编程
    Python中的变量以及变量的命名
    Python中的列表、元组、字典、字符串及切片操作
    Python中的socket编程
    Nginx对代理HTTP资源的限制访问
    【笨嘴拙舌WINDOWS】GDI映射方式
    【笨嘴拙舌WINDOWS】GDI(2)
    【笨嘴拙舌WINDOWS】GDI(1)
    【笨嘴拙舌WINDOWS】Dj,oh!nonono,It is about DC
    【笨嘴拙舌WINDOWS】消息机制
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11760929.html
Copyright © 2020-2023  润新知