zoukankan      html  css  js  c++  java
  • hdu 4272 LianLianKan ( dp + 状态压缩 2012 ACM/ICPC Asia Regional Changchun Online)

    http://acm.hdu.edu.cn/showproblem.php?pid=4272

    题意:

    题意:长度为n(n<=1000)的栈,栈顶元素可以与下面1~5个数中相同的元素消去,问最后能都完全消去。
    题解:

    状态压缩 dp  如何判断一个 物品 是否可以 被删除 ,首先 最坏的 情况是  2 0 0 0 0  1 1 1 1 2   假如我们要消除 栈顶的 2  ,0表示已经被删除了。

    我们要 知道 包括 本身在内的  10 个 数位

     dp[h][i] 表示  高度 为  h   状态 为  i  能否   全部 消除 1  表示可以 0表示 不可以

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<set>
     7 #include<map>
     8 #include<queue>
     9 #include<vector>
    10 #include<string>
    11 #define Min(a,b) a<b?a:b
    12 #define Max(a,b) a>b?a:b
    13 #define CL(a,num) memset(a,num,sizeof(a));
    14 #define eps  1e-12
    15 #define inf   0x7fffffff
    16 
    17 //freopen("data.txt","r",stdin);
    18 const double pi  = acos(-1.0);
    19 typedef   __int64  ll;
    20 const int maxn = 1200 ;
    21 using namespace std;
    22 int dp[maxn][maxn],a[maxn];
    23 int dfs(int h,int tmp)
    24 {
    25 
    26     int i,j ,k;
    27     if( h < 0)
    28     {
    29         if(tmp == 0 ) return 1;
    30         else return  0 ;
    31     }
    32     if(dp[h][tmp]!=-1return dp[h][tmp] ;
    33     int &ret = dp[h][tmp] ;
    34 
    35     int t = (1<<9)& tmp ;
    36     ret = 0;
    37     if(!t)// 如果此位已经 被选过了
    38     {
    39        int  k = tmp << 1;
    40        if(h - 10 >= 0)  ret = dfs(h - 1,k + 1);
    41        else   ret = dfs(h - 1,k);
    42     }
    43     else
    44     {
    45 
    46         int cnt = 0;
    47         tmp = tmp^( 1 << 9);
    48         for(i = 1,j = 8;i<= 9,j >= 0;i++,j--)
    49         {
    50             if(tmp &(1 << j))
    51             {
    52                 cnt++;
    53 
    54                 if(cnt > 5)break;
    55 
    56              if(a[h] == a[h - i])
    57              {
    58                 int t = tmp^( 1 << j);
    59                 t<<=1;
    60                 if(h - 10>=0) t += 1;
    61 
    62                  ret = dfs(h - 1,t);
    63                  if(ret)  break ;
    64 
    65 
    66              }
    67            }
    68         }
    69     }
    70 
    71     return ret;
    72 
    73 
    74 }
    75 int main()
    76 {
    77     int  n , m,i,j;
    78     while(~scanf("%d",&n))
    79     {
    80         for(i = 0 ; i<n;i++)
    81            scanf("%d",&a[i]);
    82 
    83         int tp = 0;
    84         for(i = n - 1,j = 0;i >= 0&& j <= 9;i--,j++)
    85         {
    86             tp = (tp << 1) + 1;
    87         }
    88 
    89         while(j <= 9)tp<<= 1,j++ ;
    90 
    91         CL(dp ,-1);
    92         int ans = dfs(n - 1,tp);
    93         if(ans)puts("1");
    94         else puts("0");
    95     }
    96 }
  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/acSzz/p/2685472.html
Copyright © 2011-2022 走看看