WA 61pts 求调
查看原帖
WA 61pts 求调
376997
Harry27182SDream楼主2022/9/14 21:04

大体思路就是 dp。WA 61 pts。

#include<bits/stdc++.h>
using namespace std;
int n,f[2][10005][2],a[10005],maxn[10005],ans;
const int mod=1000007;
int main()
{
	//freopen("teams.in","r",stdin);
	//freopen("teams.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),maxn[i]=max(maxn[i-1],a[i]);
	//f[i][j][0/1]表示前 i 位,最大值为 j,是否顶到上界的方案数
	f[0][0][0]=1;
	for(int i=1;i<=n;i++)
	{
		int p=i&1;
		memset(f[p],0,sizeof(f[p]));
		for(int j=1;j<=maxn[i];j++)
		{
			if(j==a[i])f[p][j][0]=(f[p][j][0]+f[p^1][j-1][0])%mod,f[p][j][1]=(f[p][j][1]+f[p^1][j-1][1])%mod;
			else if(j>a[i])f[p][j][1]=(f[p][j][1]+f[p^1][j-1][1])%mod;
			else f[p][j][1]=(f[p][j][1]+f[p^1][j-1][1]+f[p^1][j-1][0])%mod;
			if(j>=a[i])f[p][j][0]=(f[p][j][0]+f[p^1][j][0])%mod,f[p][j][1]=(f[p][j][1]+1ll*j*f[p^1][j][1]%mod+1ll*(a[i]-1)*f[p^1][j][0]%mod)%mod;
			else f[p][j][1]=(f[p][j][1]+1ll*j*(f[p^1][j][0]+f[p^1][j][1])%mod)%mod;
		}
	} 
	for(int i=1;i<=maxn[n];i++)ans=(ans+f[n&1][i][1])%mod;
	printf("%d",(ans+1)%mod);
	return 0;
}
2022/9/14 21:04
加载中...