AtCoder Grand Contest 031(UPC个人训练赛第十五场)

传送门:

  [1]:AtCoder

  [2]:UPC

参考资料

  [1]:https://www.cnblogs.com/QLU-ACM/p/11191644.html

B.Reversi(记录结果再利用的DP)

•题意

  有 n 个石子,编号为 1~n ,第 i 个石子被涂成颜色 coli

  操作:任选两个颜色相同的石子 i,j ,i 与 j 之间的所有石子涂成颜色 coli

  上述操作可以不执行,也可以执行多次;

  求最多有多少不同的颜色序列;

•题解

  定义 dp[ i ] 前 i 个石子最多的不同的颜色序列;

  对于第 i 个石子,可求出距石子 i 最近的石子 j ,并且石子 j 满足 j < i && coli = col

  那么对于位置 i , j :

  ①如果不执行操作,那么 dp[ i ]=dp[ i-1 ];

  ②如果执行操作,并且 j ≠ i-1 ,那么 dp[ i ] = dp[ j ];

  综上,对于第 i 个位置的石子,首先令 dp[ i ]=dp[ i-1 ],如果 j ≠ i-1,dp[ i ] += dp[ j ];

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int MOD=1e9+7;
 5 const int maxn=2e5+50;
 6
 7 int n;
 8 int col[maxn];
 9 int pos[maxn];
10 ll dp[maxn];
11
12 ll Solve()
13 {
14     dp[0]=0;
15     dp[1]=1;
16     pos[col[1]]=1;
17
18     for(int i=2;i <= n;++i)
19     {
20         dp[i]=dp[i-1];
21         int j=pos[col[i]];
22
23         if(j != i-1)
24         {
25             dp[i] += dp[j];
26             dp[i] %= MOD;
27         }
28
29         pos[col[i]]=i;///不管j是否为i-1,都要更新pos[col[i]];
30     }
31     return dp[n]%MOD;
32 }
33 int main()
34 {
35     scanf("%d",&n);
36     for(int i=1;i <= n;++i)
37         scanf("%d",col+i);
38
39     printf("%d\n",Solve());
40
41     return 0;
42 }

 

原文地址:https://www.cnblogs.com/violet-acmer/p/11193983.html

时间: 2024-10-29 18:25:07

AtCoder Grand Contest 031(UPC个人训练赛第十五场)的相关文章

Contest1657 - 2019年我能变强组队训练赛第十四场

Contest1657 - 2019年我能变强组队训练赛第十四场 Similarity of Subtrees #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=100100; ull ha[maxn]; vector<int>E[maxn]; unordered_map<ull,int>m;

1780 - 2019年我能变强组队训练赛第十八场

题目描述 wls有一个钟表,当前钟表指向了某一个时间. 又有一些很重要的时刻,wls想要在钟表上复现这些时间(并不需要依次复现).我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,wls想知道秒针至少转动多少角度可以使每个时刻至少都会被访问一次. 注意,时钟上的一种时针分针秒针的组合,可以代表两个不同的时间. 输入 第一行一个整数n代表有多少个时刻要访问. 第二行三个整数h,m,s分别代表当前时刻的时分秒. 最后n行每一行三个整数hi,mi,si代表每个要访问的时刻

AtCoder Grand Contest 031 B - Reversi(DP)

B - Reversi 题目链接:https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: 给出n个数,然后现在你可以对一段区间修改成相同的值,前提是左右端点的值相同.问最后这n个数有多少种不同的值. 题解: 设dp[i]表示只考虑1~i这段,有多少不同的值.然后对于当前第i位,有两种选择,修改或者不修改,不修改的话就是dp[i-1]:修改的话就是dp[k],这里k表示上一个相同颜色的位置. 注意一下如果i-1和i的颜色相同,当前要跳过,这个时候

AtCoder Grand Contest 031 (AGC031) F - Permutation and Minimum 动态规划

原文链接www.cnblogs.com/zhouzhendong/p/AGC031F.html 草率题解 对于每两个相邻位置,把他们拿出来. 如果这两个相邻位置都有确定的值,那么不管他. 然后把所有的这些数拿出来,分为两类,一类是没有被填入的,一类是被填入的. 然后大力DP即可.由于没有被填入的可以任意排列,所以最后还要乘上一个阶乘. 代码 #include <bits/stdc++.h> #define clr(x) memset(x,0,sizeof x) #define For(i,a,

备战省赛组队训练赛第十六场(UPC)

传送门 题解: by 鲁东大学 (提取码:8972) 原文地址:https://www.cnblogs.com/QLU-ACM/p/10803598.html

AtCoder Grand Contest 025 Problem D

www.cnblogs.com/shaokele/ AtCoder Grand Contest 025 Problem D Time Limit: 2 Sec Memory Limit: 1024 MB Description Takahashi is doing a research on sets of points in a plane. Takahashi thinks a set \(S\) of points in a coordinate plane is a good set w

AtCoder Grand Contest 024 Problem E(动态规划)

www.cnblogs.com/shaokele/ AtCoder Grand Contest 024 Problem E Time Limit: 2 Sec Memory Limit: 1024 MB Description Find the number of the possible tuples of sequences (\(A_0,A_1,-,A_N\)) that satisfy all of the following conditions, modulo \(M\): ? Fo

AtCoder Grand Contest 011

AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\(n\)个乘客到达了飞机场,现在他们都要坐车离开机场.第\(i\)个乘客到达的时间是\(T_i\),一个乘客必须在\([T_i,T_i+k]\)时刻做到车,否则他会生气.一辆车最多可以坐\(C\)个人.问最少安排几辆车可以让所有人都不生气. 题解 从前往后贪心即可. #include<iostream

AtCoder Grand Contest 014

AtCoder Grand Contest 014 A - Cookie Exchanges 有三个人,分别有\(A,B,C\)块饼干,每次每个人都会把自己的饼干分成相等的两份然后给其他两个人.当其中有一个人的饼干数量是奇数的时候停止,求会进行几次这样子的操作,或者会永远进行下去. 首先无解的情况一定是三个数都是相等的偶数. 否则直接暴力模拟就行了.(盲猜答案不会很大) 证明一下答案的范围:不妨令\(A\le B\le C\),那么最大值和最小值之间的差就是\(C-A\),那么执行完一次操作之后