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

Posted violet-acmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 
View Code

 

以上是关于AtCoder Grand Contest 031(UPC个人训练赛第十五场)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

markdown AtCoder Grand Contest 016

AtCoder Grand Contest 005

AtCoder Grand Contest 006

AtCoder Grand Contest 008 题解