正题
通过观察我们会发现,一个1的点从右边出去的必定比从下面出去的多一或者等于,一个-1的点从下面出去的必定比从右边出去的多一或者等于,所以说顺序并不影响一个球到达一个点之后的走向,我们可以根据奇偶判断到达一个点的多个球有多少个球往下走或者往右走。0的情况就很简单了。
所以就直接表示第i,j这个点向下走或者向右走的有多少个。
递推一下,就做完了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
long long k;
long long f[1010][1010][2];//0:down,1:right
int main(){
scanf("%d %d",&n,&m);
scanf("%lld",&k);
f[0][1][0]=k;
int x;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&x);
long long res=f[i-1][j][0]+f[i][j-1][1];
if(x==1) {
f[i][j][1]=(res+1)/2;
f[i][j][0]=res/2;
}
else if(x==-1){
f[i][j][1]=res/2;
f[i][j][0]=(res+1)/2;
}
else {
f[i][j][1]=f[i][j-1][1];
f[i][j][0]=f[i-1][j][0];
}
}
printf("%lld",f[n][m][0]);
}

被折叠的 条评论
为什么被折叠?



