• 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 }
  • 相关阅读:
    修改MyEclipse工作空间
    Servlet
    Java虚拟机类加载机制
    编译执行和解释执行
    awt和swing
    构造函数
    小知识点
    [剑指Offer]42-连续子数组的最大和/ [LeetCode]53. 最大子序和
    [剑指Offer]40-最小的k个数
    [剑指Offer]47-礼物的最大价值(DP)
  • 原文地址:https://www.cnblogs.com/acSzz/p/2685472.html
Copyright © 2020-2023  润新知