ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

牛客月赛28-迷宫

2022-01-27 20:04:56  阅读:233  来源: 互联网

标签:va int 28 迷宫 cin 牛客 105 dp mod


I

题意:
就是给你一个n*m的矩阵,然后从1,1走到n,m,每次可以往下或者往右,并且走过的地方把权值加上,并且%1e4+7,问你又多少种不同的方式走到n,m的时候能获得多少种权值和。

思考:
这就是状态类型的dp了,但是你看这个数据范围卡的有点极限,如果直接定义dp为走到i,j的时候并且总和为k,这种状态是否可达。复杂度会到1e8。其实有时候还是可以过的,这个就可以直接转移就行了。当然还有一种操作就是bitset,bitset就是可以表示状态,和他有的值的个数。一些表示当前点可以到达哪些点的时候可以用他,比如可达性统计这道题,当然这里用bitset还有一些操作。

代码:

int T,n,m,k;
int va[105][105];
bool dp[105][105][mod]; 

signed main()
{
	IOS;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>va[i][j];
			va[i][j] %= mod;
		}
	}
	dp[1][1][va[1][1]] = 1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int k=0;k<mod;k++)
			{
				dp[i][j][(va[i][j]+k)%mod] |= dp[i-1][j][k];
				dp[i][j][(va[i][j]+k)%mod] |= dp[i][j-1][k];
			}
		}
	}
	int ans = 0;
	for(int i=0;i<mod;i++) ans += dp[n][m][i];
	cout<<ans;
	return 0;
}
bitset版本
int T,n,m,k;
int va[105][105];
bitset<30000> dp[105][105];

signed main()
{
	IOS;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>va[i][j];
			va[i][j] %= mod;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(i==1&&j==1) dp[i][j][va[i][j]] = 1;
			else if(i==1) dp[i][j] |= (dp[i][j-1]<<va[i][j]);
			else if(j==1) dp[i][j] |= (dp[i-1][j]<<va[i][j]);
			else
			{
				dp[i][j] |= (dp[i-1][j]<<va[i][j]);
				dp[i][j] |= (dp[i][j-1]<<va[i][j]);
			}
			dp[i][j] |= dp[i][j]>>mod;
		}
	}
	int ans = 0;
	for(int i=0;i<mod;i++) ans += dp[n][m][i];
	cout<<ans;
	return 0;
}

总结:
多多积累经验,尝试尝试。

标签:va,int,28,迷宫,cin,牛客,105,dp,mod
来源: https://blog.csdn.net/m0_52398496/article/details/122722862

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有