CF14E Camels题解

Solution : dp

考虑定义 \(f_{i,j,k,p,q}\) :到第 \(i\) 个,有 \(j\)\(a_{i-1}>a_i<a_{i+1}\)\(k\)\(a_{i-1}<a_i>a_{i+1}\) 当前位置取 \(p\)\(q:a_{i-1}<a_i:0,a_{i-1}>a_i:1\)

转移:

\(f_{i,j,k,p,0}=\sum_1^{p-1} f_{i-1,j,k,q,0}+f_{i-1,j-1,k,q,1}\)

\(f_{i,j,k,p,1}=\sum_{p+1}^4 f_{i-1,j,k,q,1}+f_{i-1,j,k-1,q,0}\)

code

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("inline")
#include<bits/stdc++.h>
#define re register
#define int long long
#define fep(i,l,r) for(re int i=l;i<=r;++i)
#define For(i,u) for(re int i=head[u];i;i=e[i].nxt)
#define feb(i,r,l) for(re int i=r;i>=l;--i)
using namespace std;

const int N = 21,M = 11;
int f[N][M][M][5][2],n,t;
//到第i个有j个a[i-1]>a[i]<a[i+1] k个a[i-1]<a[i]>a[i+1]当前位置取 p a[i-1]<a[i]:0,a[i-1]>a[i]:1 

inline int read() { int s=0,w=1; char ch=getchar(); while(!(ch<='9'&&ch>='0')) {if(ch=='-') w=-1; ch=getchar();} while(ch<='9'&&ch>='0') {s=(s<<1)+(s<<3)+ch-'0'; ch=getchar();} return s*w; }
inline void write(int x) { if(x>=10) write(x/10); putchar(x%10+'0'); }
inline void print(int x,char ch) { if(x<0) putchar('-'),x=~(x-1); write(x);  putchar(ch);}
inline void swap(int &x,int &y) {x^=y,y^=x,x^=y;}

signed main()
{
	n=read(),t=read();
	if(n<=2) puts("0"),exit(0);
	fep(i,1,4) f[2][0][0][i][0]=i-1,f[2][0][0][i][1]=4-i;
	//fep(i,1,4) cout<<f[2][0][0][i][0]<<" "<<f[2][0][0][i][1]<<endl;
	fep(i,3,n)
	{
		fep(j,0,t-1)//a[i-1]>a[i]<a[i+1]
		{
			fep(k,0,t)//a[i-1]<a[i]>a[i+1]
			{
				fep(p,1,4)
				{
					//a[i-1]<a[i]:0,a[i-1]>a[i]:1 
					fep(q,1,p-1) f[i][j][k][p][0]+=f[i-1][j][k][q][0]+f[i-1][j-1][k][q][1];//a[i-2]>a[i-1]<a[i]
					fep(q,p+1,4) f[i][j][k][p][1]+=f[i-1][j][k][q][1]+f[i-1][j][k-1][q][0];//a[i-2]<a[i-1]>a[i]
				//	cout<<i<<" "<<j<<" "<<k<<" "<<p<<" "<<f[i][j][k][p][0]<<" "<<f[i][j][k][p][1]<<endl;
				}
			}
		}
	}
	int ans=0;
	fep(p,1,4) ans+=f[n][t-1][t][p][0]+f[n][t-1][t][p][1];
	print(ans,'\n');
	return 0;
}
posted @ 2022-05-14 08:09  starrylasky  阅读(31)  评论(0)    收藏  举报