记录编号 303898 评测结果 AAAAAAAAAAAAAAA
题目名称 牛跳房子 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 2.743 s
提交时间 2016-09-06 20:45:11 内存使用 5.06 MiB
显示代码纯文本
#include<cstdio>
const int p=1000000007,N=760;
int c[N][N],dp[N][N],sum[N*N],n,m,k;
//dp[i][j]表示行走到(i,j)的方案数 
void solve(int l,int r){//CDQ分治列 
	if (l==r) return;
	int mid=(l+r)/2,allsum=0;
	solve(l,mid);
	for (int i=1;i<=n;i++){//按行更新 
		for (int j=mid+1;j<=r;j++)//更新对右半区间的贡献 
			dp[i][j]=((dp[i][j]+allsum-sum[c[i][j]])%p+p)%p;
		for (int j=l;j<=mid;j++)//按行更新和 
			allsum=(allsum+dp[i][j])%p,
			sum[c[i][j]]=(sum[c[i][j]]+dp[i][j])%p;
	}
	for (int i=1;i<=n;i++)
	for (int j=l;j<=mid;j++)
		sum[c[i][j]]=0;
	solve(mid+1,r);
}
int main()
{
	freopen("hopscotch.in","r",stdin);
	freopen("hopscotch.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
		scanf("%d",&c[i][j]);
	dp[1][1]=1;
	solve(1,m);
	printf("%d\n",dp[n][m]);
	return 0;
}