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\n",ans);
	return 0;
}
posted @   zdxx  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示