• hdu--5074--dp


    这算考虑不同条件下的dp吧

    一层一层递推过去  主要是dp状态的定义不能想错了

    dp[x,y]在第x个位置编号为y的时候可以获得的前X个位置获得的价值总额

    因为任何一个价值都是由 score[x,x+1]构成的 所以我们可以从i =2开始遍历 因为1的时候 答案肯定是0

    然后就是对于a[x] , a[x-1] ( x>=2 ) 正负号不同情况的分析了 这里 内存循环 m 的遍历顺序是没有关系 正序 逆序无所谓

    状态转移方程呢 就是

    dp[x,y] = max( dp[x,y] , dp[x-1,z] + score[z][y] )其实方程不止一个 你可以看代码里不同情况的分析 主要是这种情况最难表示点

    感觉 这代码 写下来特别清爽

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int n , m;
     7 const int size = 110;
     8 int a[size];
     9 int score[size][size];
    10 int dp[size][size];
    11 
    12 void solve( )
    13 {
    14     for( int i = 2 ; i<=n ; i++ )
    15     {
    16         if( a[i]<=0 )
    17         {
    18             for( int j = m ; j>=1 ; j-- )
    19             {
    20                 if( a[i-1]<=0 )
    21                 {
    22                     for( int k = m ; k>=1 ; k-- )
    23                     {
    24                         dp[i][j] = max( dp[i][j] , dp[i-1][k] + score[k][j] );
    25                     }
    26                 }
    27                 else
    28                 {
    29                     dp[i][j] = max( dp[i][j] , dp[i-1][ a[i-1] ] + score[ a[i-1] ][j] );
    30                 }
    31             }
    32         }
    33         else
    34         {
    35             if( a[i-1]<=0 )
    36             {
    37                 for( int j = m ; j>=1 ; j-- )
    38                 {
    39                     dp[i][ a[i] ] = max( dp[i][ a[i] ] , dp[i-1][j] + score[j][ a[i] ] );
    40                 }
    41             }
    42             else
    43             {
    44                 dp[i][ a[i] ] = max( dp[i][ a[i] ] , dp[i-1][ a[i-1] ] + score[ a[i-1] ][ a[i] ] );
    45             }
    46         }
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     cin.sync_with_stdio(false);
    53     int t;
    54     int ans;
    55     cin >> t;
    56     while( t-- )
    57     {
    58         memset( dp , 0 , sizeof(dp) );
    59         ans = 0;
    60         cin >> n >> m;
    61         for( int i = 1 ; i<=m ; i++ )
    62         {
    63             for( int j = 1 ; j<=m ; j++ )
    64             {
    65                 cin >> score[i][j];
    66             }
    67         }
    68         for( int i = 1 ; i<=n ; i++ )
    69         {
    70             cin >> a[i];
    71         }
    72         solve( );
    73         for( int i = 1 ; i<=n ; i++ )
    74         {
    75             ans = max( dp[n][i] , ans );
    76         }
    77         cout << ans << endl;
    78     }
    79     return 0;
    80 }
    View Code

    today:

      上次拍的微电影找不到了 不能给学妹看了 wtf

  • 相关阅读:
    node学习网站
    UDP 通讯设置超时时间
    Linux下的五个查找命令:grep、find、locate、whereis、which
    apache 2.4设置禁止访问phpmyadmin
    apache 禁止访问根目录
    linux 下 apache启动、停止、重启命令
    Apache2.4使用require指令进行访问控制–允许或限制IP访问/通过User-Agent禁止不友好网络爬虫
    Apache httpd.conf配置文件AllowOverride参数详解
    链接远程mysql
    svn提交后利用hooks自动更新web服务器
  • 原文地址:https://www.cnblogs.com/radical/p/4116277.html
Copyright © 2020-2023  润新知