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


    题目链接:https://www.luogu.com.cn/problem/P1373

    题意(不想写了,从某题解里抄了一份):

    两个人绑在一起走,但是每次吸收的人交换,可以向右向下走,求二者魔瓶内体积相等的方案数目

    考虑状态 dp[i][j][p][0/1],表示走到(i,j)结束,a减去uim的差值为p,最后走的人是a/uim的方案数。首先初始化 dp[i][j][a[i][j]][0]=1; 最终答案为Σdp[i][j][0][1]。有转移方程(此时已经令k=k+1):

    dp[i][j][p][0]+=( dp[i-1][j][(p-a[i][j]+k)%k][1]+dp[i][j-1][(p-a[i][j]+k)%k][1] )

    (a走最后一步,差值变大了,从p-a[i][j]-->p。但是p-a[i][j]可能<0,所以找到等价的正数)

    dp[i][j][p][1]+=( dp[i-1][j][(p+a[i][j])%k][0]+dp[i][j-1][(p+a[i][j])%k][0] )

    (uim走最后一步,差值变小)

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int mod=1e9+7;
    const int maxn=800+10;
    
    int a[maxn][maxn];
    int dp[maxn][maxn][20][2]; 
    int n,m,i,j,k,p,q;
    
    int main(){
    	std::ios::sync_with_stdio(false);
    	cin>>n>>m>>k; k++; 
    	memset(dp,0,sizeof(dp));
    	for (i=1;i<=n;i++)
    	  for (j=1;j<=m;j++){
    	  	cin>>a[i][j];
    	  	dp[i][j][a[i][j]][0]=1; //*
    	  }
    	for (i=1;i<=n;i++)
    	  for (j=1;j<=m;j++)
    	    for (p=0;p<k;p++){
    	      int t1=(p-a[i][j]+k)%k; int t2=(p+a[i][j])%k; //*
    	      dp[i][j][p][0]=(dp[i][j][p][0]+dp[i-1][j][t1][1]+dp[i][j-1][t1][1])%mod;
    	      dp[i][j][p][1]=(dp[i][j][p][1]+dp[i-1][j][t2][0]+dp[i][j-1][t2][0])%mod;
    		}
    	ll ans=0;
    	for (i=1;i<=n;i++)
    	  for (j=1;j<=m;j++)
    	    ans=(ans+dp[i][j][0][1])%mod;
    	cout<<ans<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    Java线程的几种状态
    常用几种Java Web容器
    数据库触发器
    SQL优化及注意事项
    Oracle中rownum和rowid的区别
    数据库及SQL优化
    如何安装使用Impala
    Impala:新一代开源大数据分析引擎
    开源大数据查询分析引擎
    Google Dremel 原理
  • 原文地址:https://www.cnblogs.com/edmunds/p/13413914.html
Copyright © 2020-2023  润新知