zoukankan      html  css  js  c++  java
  • hdu--5119--决策方案数dp

    其实 北京站的 dp都没想象中的难..

    but .. ..

    dp[x,y]表示前x个数xor值==y的方案数有多少种

    转移的时候 首先可以将上层的完全赋值到这层 就是假设 a[i] 不参与xor异或

    然后 a[i]与上层值进行异或 需要2次遍历所有的方案数

    我一度担心要tle 但是 n很小 才40.

    我一开始没用滚动数组 直接开了40的。

    后来一开滚动数组 我也就不知道为什么一直re...

    排了很久 发现我将dp[x,y]的首位开成3 就可以 开成2不可以 我就郁闷了

    明明只可能取到0或1啊  因为 num&1 的结果 不是只有0或1吗。。

    无语。。。

    没想明白.. 要是我明白了 会在下面补上原因

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 typedef long long LL;
     6 int n;
     7 const int size = 1000000;
     8 LL dp[2][size+10];
     9 int a[45];
    10 
    11 void solve( )
    12 {
    13     for( int i = 1 ; i<=n ; i++ )
    14     {
    15         for( int j = 0 ; j<=size ; j++ )
    16         {
    17             dp[ i&1 ][j] = dp[ !(i&1) ][j];
    18         }
    19         for( int j = 0 ; j<=size ; j++ )
    20         {
    21             dp[ i&1 ][ j^a[i] ] += dp[ !(i&1) ][j];
    22         }
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     cin.sync_with_stdio(false);
    29     int t , m;
    30     LL ans;
    31     cin >> t;
    32     for( int k = 1 ; k<=t ; k++ )
    33     {
    34         cin >> n >> m;
    35         memset( dp , 0 , sizeof(dp) );
    36         for( int i = 1 ; i<=n ; i++ )
    37         {
    38             cin >> a[i];
    39         }
    40         dp[0][0] = 1;
    41         ans = 0;
    42         solve( );
    43         for( int i = m ; i<=size ; i++ )
    44         {
    45             ans += dp[n&1][i];
    46         }
    47         cout << "Case #" << k << ": " << ans << endl;
    48     }
    49     return 0;
    50 }
    View Code
     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 typedef long long LL;
     6 int n;
     7 const int size = 1000000;
     8 LL dp[3][size+10];
     9 int a[45];
    10 
    11 void solve( )
    12 {
    13     for( int i = 1 ; i<=n ; i++ )
    14     {
    15         for( int j = 0 ; j<=size ; j++ )
    16         {
    17             dp[ i&1 ][j] = dp[ !(i&1) ][j];
    18         }
    19         for( int j = 0 ; j<=size ; j++ )
    20         {
    21             dp[ i&1 ][ j^a[i] ] += dp[ !(i&1) ][j];
    22         }
    23     }
    24 }
    25 
    26 int main()
    27 {
    28     cin.sync_with_stdio(false);
    29     int t , m;
    30     LL ans;
    31     cin >> t;
    32     for( int k = 1 ; k<=t ; k++ )
    33     {
    34         cin >> n >> m; 
    35         memset( dp , 0 , sizeof(dp) );
    36         for( int i = 1 ; i<=n ; i++ )
    37         {
    38             cin >> a[i];
    39         }
    40         dp[0][0] = 1;
    41         ans = 0;
    42         solve( );
    43         for( int i = m ; i<=size ; i++ )
    44         {
    45             ans += dp[n&1][i];
    46         }
    47         cout << "Case #" << k << ": " << ans << endl;
    48     }
    49     return 0;
    50 }
    View Code

    today:

      nightmare

      下雨了

      等一个人的咖啡

      等一个人的电话

  • 相关阅读:
    oracle sql日期比较
    rlwrap真是一个好东西
    Dataguard 归档丢失处理
    oracle latch工作原理
    Latch free等待事件
    Redhat Enterprise Linux 5 安装 Oracle 10g release 2
    oracle 日期问题
    Oracle自动存储管理 ASMLib的支持变化
    [官方文档] oracle官方文档总汇(9i,10g,11gR1, 11gR2)
    实时分布式搜索引擎比较(senseidb、Solr、elasticsearch)
  • 原文地址:https://www.cnblogs.com/radical/p/4133327.html
Copyright © 2011-2022 走看看