zoukankan      html  css  js  c++  java
  • UPC个人训练赛第十五场(AtCoder Grand Contest 031)

    传送门:

      [1]:AtCoder

      [2]:UPC比赛场

      [3]:UPC补题场

    参考资料

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

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

    •参考资料

      [1]:中国石油大学(华东), 张森

    •题意

      有 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
    ",Solve());
    40 
    41     return 0;
    42 }
    View Code

     


    G.轮回(待解决)

    •参考资料

      [1]:wjyyy

  • 相关阅读:
    微信公众号--JS-SDK
    微信公众号--网页授权
    微信公众号--资源请求
    微信公众号--相关资料
    微信公众号--消息回复
    一.小程序 --申请
    2017年总结
    SSM框架中常用的配置文件
    UML的9种图例解析
    23种设计模式汇总整理
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/11193983.html
Copyright © 2011-2022 走看看