专栏文章

P3120 [USACO15FEB] Cow Hopscotch G 题解

P3120题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mir2wfu0
此快照首次捕获于
2025/12/04 14:52
3 个月前
此快照最后确认于
2025/12/04 14:52
3 个月前
查看原文
小清新暴力题。
首先,如果排除限制“B 格子的标号和 A 格子的标号不同”,是一个典中典的简单 DP。
加上限制后,考虑用加上前的得数减去“B 格子的标号和 A 格子的标号相同”的,得到正确答案。
怎么做呢?显然可以使用一个桶,对于每一行分别处理。具体的,遍历到 (x,y)(x,y) 时,valkval_k 中存储的是 i=1x1j=1y1[ai,j=ax,y]fi,j\sum\limits_{i=1}^{x-1}\sum\limits_{j=1}^{y-1}[a_{i,j}=a_{x,y}]f_{i,j}。我们在 (i,n)(i+1,1)(i,n)\rightarrow (i+1,1) 时,清空 valval 数组;在 (i,j)(i,j+1)(i,j)\rightarrow (i,j+1) 时,加入 f1i1,jf_{1\sim i-1,j}。总时间复杂度 O(n2m)O(n^2m)
加上一些快读和卡常,即可通过。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=760;
const int mod=1000000007;
int n,m,k,a[N][N],val[N*N],f[N][N];
inline int read(){
	char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	int x=0;
	while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x;
}
inline void add(int &x,int y){
	((x+=y)>=mod?x-=mod:0);
}
inline int sub(int x,int y){
	return x-y+(x<y?mod:0);
} 
int main(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=read();
	f[1][1]=1;
	for(int i=2;i<=n;i++){
		int res=0;
		memset(val,0,sizeof(val));
		for(int j=2;j<=m;j++){
			for(int k=1;k<i;k++) add(val[a[k][j-1]],f[k][j-1]),add(res,f[k][j-1]); 
			f[i][j]=sub(res,val[a[i][j]]);
		}
	}
	printf("%d",f[n][m]);
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...