列表

详情


NC208347. 迷宫

描述

有一个n×m的网格地图,每个点有个值,现在牛牛要从,他可以往右边或者往下走,每次到一个点会获得当前的点权值,并将权值和mod ,当牛牛从不同方式走到的时候能获得多少种权值和?

输入描述

第一行输入正整数

接下来  行每行有  个正整数,分别代表

输出描述

输出一行,表示到(n,m)点的时候的权值和种数

示例1

输入:

2 2
1 1
2 2

输出:

2

说明:

有1+1+2和1+2+2两种

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 20ms, 内存消耗: 13176K, 提交时间: 2020-09-21 23:24:01

#include<bits/stdc++.h>
using namespace std;
bitset<10007>B[110][110],x,y,z;
int mo=1e4+7,A[110][110];
int main()
{
	int i,n,m,a,j;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	cin>>A[i][j];
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			a=A[i][j]%mo;
			z=B[i-1][j]|B[i][j-1];
			x=z<<a;
			y=z>>(mo-a);
			B[i][j]=x|y;
			if(i==1&&j==1)
			B[1][1][a]=1;
		}
	}
	cout<<B[n][m].count()<<endl;
}

C++(clang++11) 解法, 执行用时: 15ms, 内存消耗: 12792K, 提交时间: 2021-02-18 20:42:55

#include<cstdio>
#include<bitset>
#define mod 10007
using namespace std;
int n,m,a;
bitset<mod>bs[101][101],l;
int main() {
	scanf("%d %d",&n,&m);
	bs[0][1][0]=1;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			scanf("%d",&a);
			a%=mod;
			l=(bs[i-1][j]|bs[i][j-1]);
			bs[i][j]=((l<<(mod-a))|(l>>a));
		}
	}
	printf("%d",bs[n][m].count());
	return 0;
}

上一题