access做网站,网站空间管理,开发平台选择,怎么注册公司名正题 题目大意
长度为nnn的序列#xff0c;mmm个位置要求两边都比他大#xff0c;kkk个位置要求两边都比他小。求序列个数。 解题思路
若第xxx个位置为山峰#xff0c;那么ax−1axax1a_{x-1}a_xa_{x1}ax−1axax1#xff0c;我们用upiup_iu…正题 题目大意
长度为nnn的序列mmm个位置要求两边都比他大kkk个位置要求两边都比他小。求序列个数。 解题思路
若第xxx个位置为山峰那么ax−1axax1a_{x-1}a_xa_{x1}ax−1axax1我们用upiup_iupi表示第iii个位置与前面数的大小关系。
然后用fi,jf_{i,j}fi,j表示前iii个数是1∼i1\sim i1∼i最后一个为jjj时的方案数然后根据upiup_iupi转移即可。 codecodecode
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll XJQ1e97,N5100;
ll n,m,k,up[N],f[N][N],ans,sum[N];
bool flag;
int main()
{scanf(%lld%lld%lld,n,m,k);for(ll i1;im;i){ll x;scanf(%lld,x);x;
// if(up[x]up[x]1||up[x1]up[x1]2)
// {flag1;break;}up[x]2;up[x1]1;}for(ll i1;ik;i){ll x;scanf(%lld,x);x;
// if(up[x]up[x]2||up[x1]up[x1]1)
// {flag1;break;}up[x]1;up[x1]2;}if(flag){putchar(0);return 0;}f[1][1]1;for(ll i2;in;i){for(ll j1;ji;j)sum[j](sum[j-1]f[~i1][j])%XJQ;if(!up[i])for(ll j1;ji;j)f[i1][j]sum[i-1];else if(up[i]1)for(ll j1;ji;j)f[i1][j]sum[j-1];elsefor(ll j1;ji;j)f[i1][j](sum[i-1]-sum[j-1]XJQ)%XJQ;}for(ll i1;in;i)(ansf[n1][i])%XJQ;printf(%lld,ans);
}