记录编号 |
303898 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
牛跳房子 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
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;
}