20201006国庆day4

T1:

#include<bits/stdc++.h>
using namespace std;
const int N=25010;
const int K=30;
const int MOD=1e9+7;
int f[N][K][K][2],g[N][K][K][2],n,k;
int R[N][K],L[N][K],tmp[K][2],pos[N],h[N];
void update(int &x,int y) {
	x+=y;
	if(x>=MOD)x-=MOD;
}
void work(int f[N][K][K][2],int L[N][K]) {
	L[0][1]=0;
	for(int i=1; i<=n; i++) {
		int cnt=0,j=1;
		for(; j<=k+1&&j<=i&&L[i-1][j]>=h[i]; L[i][++cnt]=L[i-1][j++]);
		if(cnt<=k+1)L[i][++cnt]=h[i],pos[i]=cnt;
		for(; j<=k+1&&j<=i&&cnt<=k+1; L[i][++cnt]=L[i-1][j++]);
	}
	f[0][1][0][0]=1;
	for(int i=0; i<n; i++)
		for(int x=1; x<=k+1; x++)
			if(x<=i+1)
				for(int j=0; j<=k; j++)
					for(int tag=0; tag<2; tag++) {
						if(L[i][x]<h[i+1]) {
							update(f[i+1][pos[i+1]][j][tag],f[i][x][j][tag]);
							if(j<k)update(f[i+1][x+1][j+1][tag^(L[i][x]&1)],f[i][x][j][tag]);
						}
						else {
							update(f[i+1][x][j][tag^((L[i][x]-h[i+1])&1)],f[i][x][j][tag]);
							if(j<k)update(f[i+1][x][j+1][tag^(L[i][x]&1)],f[i][x][j][tag]);
						}
					}
}
int main() {
	scanf("%d%d",&n,&k);
	for(int i=1; i<=n; i++)scanf("%d",&h[i]);
	work(f,L);
	reverse(h+1,h+n+1);//反转字符串
	work(g,R);
	int ans=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=k+1;j++)
			for(int tag=1;tag<=2;tag++)
				tmp[j-1][tag-1]=0;
		for(int x=1;x<=k+1;x++)
			if(x<=n-i+1&&L[n-i][x]<h[i])
				for(int j=1;j<=k+1;j++)
					for(int tag=1;tag<=2;tag++)
						update(tmp[j-1][tag-1],f[n-i][x][j-1][tag-1]);
		for(int x=1;x<=k+1;x++)
			if(x<=i&&R[i-1][x]<=h[i])
				for(int j=1;j<=k+1;j++)
					for(int tag=1;tag<=2;tag++)
						update(ans,1ll*g[i-1][x][j-1][tag-1]*tmp[k-(j-1)][tag-1]%MOD);
	}
	printf("%d
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/zdxx/p/13773660.html