码迷,mamicode.com
首页 > 其他好文 > 详细

联考8.4

时间:2017-08-05 14:05:35      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:从后往前   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 }

 

联考8.4

标签:从后往前   name   scanf   应该   for   细节   环境   取反   非洲人   

原文地址:http://www.cnblogs.com/HLXZZ/p/7289967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!