码迷,mamicode.com
首页 > 其他好文 > 详细

hdu--5074--dp

时间:2014-11-23 13:01:49      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

这算考虑不同条件下的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] )其实方程不止一个 你可以看代码里不同情况的分析 主要是这种情况最难表示点

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

 

bubuko.com,布布扣
 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

hdu--5074--dp

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/radical/p/4116277.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!