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

      下雨了

      等一个人的咖啡

      等一个人的电话

  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/radical/p/4133327.html
Copyright © 2011-2022 走看看