标签:从后往前 name scanf 应该 for 细节 环境 取反 非洲人
day1真是萎的不行,又是被大佬们一阵狂踩......
T1在楼上打孔的环境下看了将近半个多小时才把题目看懂= =,手画了几组样例,感觉暴力都不怎么会打就过了......,0分
T2看了一下没什么特别的思路,30分暴搜直接上吧,结果哈希判重时k<<1打成了1<<k,还有不会取反的我把a[i]=!a[i]写成了a[i]^=1(取反是单目的,异或时双目的),我xxxxx,0分
T3看了前面几个数据感觉暴力很好打啊,然后又看了后面几个点,感觉二维前缀和搞一搞应该能拿六十多分,码完之后,处理了下细节,感觉很妙,结果莫名只有8分,然后捷哥没判负下标都有64分.......看来我真的是个非洲人= =,8分
0+0+8=8,蒟蒻脸上又一次挂满了脚印= =、
T1 maou:
题解:
DP
发现处理到第i位时后面的方案数与前面无关,所以可以从后往前DP(从有无后效性上来推)
状态:f[i][j]表示从后往前确定到第i位,前面最大值为j的方案数
转移:f[i][j]=f[i+1][j]*j+f[i+1][i][j+1]
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<cmath> 6 #include<algorithm> 7 #define ll long long 8 using namespace std; 9 10 const int maxn = 10010; 11 const int mod = 1000007; 12 13 int n,ans; 14 int dp[2][maxn],a[maxn],mx[maxn]; 15 16 int main() { 17 18 scanf("%d", &n); 19 for(int i=1; i<=n; i++) scanf("%d", &a[i]),dp[0][i]=1; 20 for(int i=1; i<=n; i++) mx[i]=max(mx[i-1],a[i-1]); 21 int now=0; 22 for(int i=n; i>=1; i--) { 23 ans+=(1ll*dp[now][mx[i]]*(a[i]-1))%mod,ans%=mod; 24 for(int k=1; k<i; k++) dp[now^1][k]=(1ll*k*dp[now][k]+dp[now][k+1])%mod; 25 now^=1; 26 } 27 printf("%d", (ans+1)%mod); 28 }
标签:从后往前 name scanf 应该 for 细节 环境 取反 非洲人
原文地址:http://www.cnblogs.com/HLXZZ/p/7289967.html