hdu--3905--dp

状态转移方程不难想 我没想到另外还要开个数组 记录上一次的最优状态 wtf

主要是另外还要开个temp数组 这样可以减少一层for循环.

dp[x,y]在前x分钟我睡觉花掉了y分钟的时间 ( x>=y )

dp[x,y] = dp[x-1,y-1]假如我在x这个时间点正在睡觉 那么我得到价值就是 x-1这个时间点是一样的 而且我的睡觉花掉的时间又相比 x-1这个时间点 增加了1分钟

//dp[x,y] = max( dp[x,y] , dp[x-L]+sum[x]-sum[x-L])在x这个时间点我在听课 这边需要遍历所有的 1-x-L

上面的方程注释掉 我觉得这写的有点误导人 虽然后面又写上了遍历范围

这样写 比较好

x>=L+y的前提下

dp[x,y] = max( dp[x,y] , dp[k][y] + sum[x]-sum[k] )  1 <=k <= x-L

其实 你可以发现 dp[k][y] + sum[x]-sum[k] 在 1<=k<=x-L-1之前 这些不就是 上一层 dp[x-1,y]所得出的吗 我们只是多增加了一个 x 这个时间点

就是 dp[x-L][y] + sum[x]-sum[x-L]

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 int n , m , L;
 7 const int size = 1010;
 8 int point[size];
 9 int sum[size];
10 int temp[size][size];
11 int dp[size][size];
12
13 void solve( )
14 {
15     for( int i = 1 ; i<=n ; i++ )
16     {
17         for( int j = 0 ; j<=m&&j<=i ; j++ )
18         {
19             if( j>=1 )
20                 dp[i][j] = dp[i-1][j-1];
21             if( i>=j+L )
22                 temp[i][j] = max( temp[i-1][j]+point[i] , dp[i-L][j]+sum[i]-sum[i-L] );
23             if( i>=L )
24                 dp[i][j] = max( dp[i][j] , temp[i][j] );
25         }
26     }
27 }
28
29 int main()
30 {
31     cin.sync_with_stdio(false);
32     while( cin >> n >> m >> L )
33     {
34         sum[0] = 0;
35         memset( dp , 0 , sizeof(dp) );
36         memset( temp , 0 , sizeof(temp) );
37         for( int i = 1 ; i<=n ; i++ )
38         {
39             cin >> point[i];
40             sum[i] = point[i] + sum[i-1];
41         }
42         solve( );
43         cout << dp[n][m] << endl;
44     }
45     return 0;
46 }

其实temp完全可以写成一维的就足够了 因为记录的只是上一层的最优状态 滚动数组的味道.

注意下 因为point肯定为正值 所以 睡觉时间肯定是m   连续听课是least L  所以我们可以连续听课时间的时间区间长度是 >=L 我觉得这点很重要 而不是恰好为L 我一开始理解错了

时间: 2024-10-18 05:19:00

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

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集合的左边,那么可以枚举集合的分割线,并且枚举出的方案要保证没有重复,如果要保证不重复,只

Bone Collector II(HDU 2639 DP)

Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3471    Accepted Submission(s): 1792 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took par

hdu 4472 dp

http://acm.hdu.edu.cn/showproblem.php?pid=4472 第一直觉找规律,第二直觉 把树拆成子树,然后递推或者DP 然后发现不行,然后才发现自己题都没读,,,, dp[i]=segma(dp[j] | (i-1)%j==0) #include <cstdio> #include <cstring> #include <cstring> const int MAXN = 1000+50; const int MOD = 1e9+7; #

hdu 5791 (DP) Two

hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1421    Accepted Submission(s): 630 Problem Description Alice gets two sequences A and B. A easy problem comes. How many pair of sequ

HDU 1069&amp;&amp;HDU 1087 (DP 最长序列之和)

H - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1087 Appoint description:  System Crawler  (2015-11-18) Description Nowadays, a kind of chess game called “Su