zoukankan      html  css  js  c++  java
  • Codeforces 1079C Playing Piano(记忆化搜索)

    题目链接:Playing Piano

    题意:给定长度为n的序列$a_i$,要求得到同样长度的序列$b_i$。满足一下条件:

    if $a_i < a_{i+1}$ then $b_i < b_{i+1}$

    if $a_i > a_{i+1}$ then $b_i > b_{i+1}$

    if $a_i = a_{i+1}$ then $b_i  eq b_{i+1}$

    $1 <= b_i <= 5$

    题解:第一个数从1-5枚举,接着从下一位开始搜索,dp[i][j]表示第i位数字为j的情况是否已经搜索过。

    当$a_i<a_{i+1}$的时候,从当前值往后搜索;当$a_i>a_{i+1}$的时候,从当前值往前搜索;$a_i=a_{i+1}$的时候,搜索和当前值不相同的值。搜索的区间范围为1-5。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 using namespace std;
     4 
     5 const int N=1e5+10;
     6 int n,a[N],b[N],dp[N][10];
     7 
     8 void dfs(int x,int val){
     9     if(x>n){
    10         printf("%d",b[1]);
    11         for(int i=2;i<=n;i++) printf(" %d",b[i]);
    12         printf("
    ");
    13         exit(0);
    14     }
    15     if(dp[x][val]) return ;
    16     dp[x][val]=1;
    17     if(a[x]>a[x-1]){
    18         for(int i=val+1;i<=5;i++){
    19             b[x]=i;
    20             dfs(x+1,i);
    21         }
    22     }
    23     else if(a[x]<a[x-1]){
    24         for(int i=1;i<=val-1;i++){
    25             b[x]=i;
    26             dfs(x+1,i);
    27         }
    28     }
    29     else{
    30         for(int i=1;i<=5;i++){
    31             if(i!=val){
    32                 b[x]=i;
    33                 dfs(x+1,i);
    34             }
    35         }
    36     }
    37 }
    38 
    39 int main(){
    40     scanf("%d",&n);
    41     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    42     for(int i=1;i<=5;i++){
    43         b[1]=i;
    44         dfs(2,i);
    45     }
    46     printf("-1
    ");
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    在 Cocos2d-x 中添加自己的微博链接
    关于屏幕适配
    [抽象工厂模式]在游戏开发中的应用
    字符串排列组合
    子矩阵最大和
    网易游戏编程题第二题
    动态规划,最大子段和
    C++的四种显示类型转换
    多线程编程
    预处理等等
  • 原文地址:https://www.cnblogs.com/pavtlly/p/9985374.html
Copyright © 2011-2022 走看看