• 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

      下雨了

      等一个人的咖啡

      等一个人的电话

  • 相关阅读:
    CUDA教程三、cuda的随机数生成
    python 使用element tree 解析 xml
    [转载] Shell正则表达式大全
    git 更新项目中子模块的版本
    git 切换到本地不存在但远端存在的分支
    vue.js3:在css中使用变量(vue@3.2.6)
    mybatis做update:动态传入要更新的字段名和字段值(mybatis 3.5.7)
    npm全局安装和非全局安装的区别(node v16.13.1 / npm 8.4.1)
    vue.js3:用mitt发送接收事件消息(vue@3.2.6 / mitt@3.0.0)
    vue3: 动态修改favicon(网站的ico 图标)(vue@3.2.26)
  • 原文地址:https://www.cnblogs.com/radical/p/4133327.html
Copyright © 2020-2023  润新知