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 }

today:

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

时间: 2024-10-10 07:45:36

hdu--5074--dp的相关文章

hdu 5074 DP 2014鞍山现场赛题

hdu 5074 http://acm.hdu.edu.cn/showproblem.php?pid=5074 挺水的DP,注意依a[i-1]和a[i]的正负区分状态转移,然后O(n^3)即可轻易解决,我DP挺弱的也能过,貌似也就CF C题水平 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algo

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long ll; const ll MOD = 9999991; const int N = 1005; int t, n, m, k, x, y; ll dp1

hdu 3944 dp?

DP? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 128000/128000 K (Java/Others)Total Submission(s): 1804    Accepted Submission(s): 595 Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,-a

hdu 5389 dp类似背包

http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of this

hdu 1025 dp 最长上升子序列

1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len

HDU 5928 DP 凸包graham

给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也就是 dp[j][k]代表当前链末端为j,其内部点包括边界数量为k的最小长度.这样最后得到的一定是最优的凸包. 然后就是要注意要dp[j][k]的值不能超过L,每跑一次凸包,求个最大的点数量就好了. 和DP结合的计算几何题,主要考虑DP怎么搞 /** @Date : 2017-09-27 17:27

HDU 4901 DP背包

给你n个数,问你将数分成两个数组,S,T ,T 中所有元素的需要都比S任意一个大,问你S中所有元素进行 XOR 操作和 T 中所有元素进行 &操作值相等的情况有多少种. DP背包思路 dpa[i][j][0]  表示从左开始到i,不取i,状态为j的方案数 dpa[i][j][1]  表示从作开始到i,取i,状态为j的方案数 dpb[i][j]      表示从右开始到i,状态为j的方案数 因为S集合一定在T集合的左边,那么可以枚举集合的分割线,并且枚举出的方案要保证没有重复,如果要保证不重复,只

HDU 5074 Hatsune Miku (线性dp)

Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 654    Accepted Submission(s): 471 Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan

hdu 5074 相邻数和最大dp

http://acm.hdu.edu.cn/showproblem.php?pid=5074 给定一个序列 有些位数未知,给你所有两个数连续所得到的能量,问你怎么安排数字使得总能量最大 二维dp,dp[i][j]表示第i位放音符j 分类讨论即可 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include &l

HDU 5074 Hatsune Miku(简单二维dp)

题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值.-1的时候可以任意替代,其他情况必须为序列上的数. 解题思路:简单二维dp,分情况处理就可以了啊. Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 637    Accepted Submission(s): 458 Problem De