我是靠谱客的博主 完美大山,这篇文章主要介绍【DP】 codeforces 466D Increase Sequence,现在分享给大家,希望可以做个参考。

很巧妙的DP。。。转化成每次都减1.。。用一维很巧妙的解决了。。。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 2005 #define maxm 40005 #define eps 1e-10 #define mod 1000000007 #define INF 999999999 #define lowbit(x) (x&(-x)) #define mp mark_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R typedef long long LL; //typedef int LL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} void scanf(int &__x){__x=0;char __ch=getchar();while(__ch==' '||__ch=='n')__ch=getchar();while(__ch>='0'&&__ch<='9')__x=__x*10+__ch-'0',__ch = getchar();} LL gcd(LL _a, LL _b){if(!_b) return _a;else return gcd(_b, _a%_b);} // head int a[maxn]; int n, m; void read(void) { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= n; i++) a[i] = m - a[i]; } void work(void) { for(int i = 1; i <= n; i++) if(a[i] < 0) { printf("0n"); return; } a[0] = a[n+1] = 0; LL ans = 1; for(int i = 1; i <= n + 1; i++) { if(a[i] == a[i-1] + 1) continue; if(a[i] == a[i-1]) ans = ans * (a[i] + 1) % mod; else if(a[i] == a[i-1] - 1) ans = ans * a[i-1] % mod; else { printf("0n"); return; } } printf("%I64dn", ans); } int main(void) { read(); work(); return 0; }


最后

以上就是完美大山最近收集整理的关于【DP】 codeforces 466D Increase Sequence的全部内容,更多相关【DP】内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部