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; }