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 = colj ;
那么对于位置 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
View Code1 #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
以上是关于AtCoder Grand Contest 031(UPC个人训练赛第十五场)的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Grand Contest 031 (AGC031) F - Permutation and Minimum 动态规划
AtCoder Grand Contest 031(UPC个人训练赛第十五场)