http://poj.org/problem?id=1036

题目分析:

由题目很容易就能想到这道题目是DP题目。

当然,它的DP方程也不难得到:

定义状态:d[i,j] 表示在时间t=i且门状态为j的时候所能取得的最大幸运值。

那么相应的状态转移方程为

d[i,j] =max(d[i-1,j-1],d[i-1,j],d[i-1][j+1])+p

如果在i时刻有坚毅度为j的混混k出现,则p=Sk,否则,p=0

由此可得该题的状态数目为O(T*K),决策数目为O(1)

总的时间复杂度为O(T*K),空间复杂度为O(T*K)。

似乎题目到此就能解题成功了,但是并非如此。

可以看到题目中Memory Limit: 10000K,这样的空间来装一个T*K即30000*100的整型数组肯定会超空间,那么该怎么办呢?

聪明的你应该能想到“离散化”(wy的专业术语,在此借用一下)。对,注意到混混的人数为1<=N<=100,T*K这么大的空间根本就没有必要开,我们只需要对混混来的时间排一下序,然后依次编号,就可以把空间减小为N*K。

至此,我们的DP方程稍稍改变一下:

定义状态:d[i,j] 表示在第i号时间且门状态为j的时候所能取得的最大幸运值。

那么相应的状态转移方程为

d[i,j] = max(d[i-1,k])+p,

其中j-interval(i-1,i)<= k <= j+interval(i-1,i),

interval(i-1,i)表示第i-1号时间到第i号时间的间隙

如果在i时刻有坚毅度为j的混混k出现,则p=Sk,否则,p=0

通过这样的压缩,我们把空间复杂度减为了O(N*K)。

于是这样一道题目就被解决了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<iomanip>using namespace std;
#define MAX 110
#define MAXK 1110
#define MAXT 11110
struct node
{int time , pros , stout ;
}a[ MAX ] ;bool cmp( node a , node b )
{return a.time < b.time ;
}int main()
{int dp[ MAX ][ MAXK ] , timetable[ MAX ] ;bool get[ MAX ][ MAXK ] ;int i,j,count,count0,time_num,time,p,d,res;int n , k , t , hh;scanf( "%d%d%d" , &n , &k , &t ) ;for( int i = 0 ; i < n ; ++i )scanf( "%d" , &a[ i ].time ) ;for( int i = 0 ; i < n ; ++i )scanf( "%d" , &a[ i ].pros ) ;for( int i = 0 ; i < n ; ++i )scanf( "%d" , &a[ i ].stout ) ;sort( a , a + n , cmp ) ;memset( get , false , sizeof( get ) ) ;timetable[ time_num = 0 ] = 0 ;for( i = 0 ; i < n ; ++i )if( a[ i ].time  != timetable[ time_num ] )timetable[ ++time_num ] = a [ i ].time ;get[ 0 ][ 0 ] = true ;count = 0 ;hh = 0 ;while( count < time_num ){time = timetable[ count ] ;while( hh < n && a[ hh ].time == time ){if( get[ count ][ a[ hh ].stout ] )dp[ count ][ a[ hh ].stout ] += a[ hh ].pros ;hh++ ;}count0 = count + 1 ;d = timetable[ count0 ] - time ;for( j = 0 ; j < k + 1; ++j )if( get[ count ][ j ] )for( p = max( j - d , 0 ) ; p <= min( j + d , k ) ; ++p ){if( dp[ count0 ][ p ] < dp[ count ][ j ] )dp[ count0 ][ p ] = dp[ count ][ j ] ;get[ count0 ][ p ] = true ;}count ++ ;}time = timetable[ count ] ;for( i = 0 ; i < n && a[ i ].time <= time ; ++i )if( a[ i ].time == time )if( get[ count ][ a[ i ].stout ] )dp[ count ][ a[ i ].stout ] += a[ i ].pros ;res = 0 ;for( i = 0 ; i < k + 1  ; ++i )if( dp[ count ][ i ] > res )res = dp[ count ][ i ] ;printf( "%d\n" , res ) ;        return 0 ;
}

poj1036-dp相关推荐

  1. DP总结 ——QPH

    常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一 ...

  2. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  5. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  6. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  7. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  8. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  9. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  10. 尼克的任务 dp 洛谷1280

    蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...

最新文章

  1. 【ACM】UVa 1339
  2. poj 1860 拓扑。。
  3. cocos2d-x游戏开发(十五)游戏加载动画loading界面
  4. C++第10周项目2扩展之2参考——迭代求和
  5. 语言三做一年级算题_一年级数学期末考试,学生交卷说能考100分,快让你家孩子试试吧...
  6. JSP-BUG-The type java.xx.xx cannot be resolved
  7. winexec函数 执行powershell 脚本_丢掉 Powershell.exe 来渗透测试
  8. 《深入理解Nginx》阅读与实践(一):Nginx安装配置与HelloWorld
  9. Spring AOP 实现用户权限验证
  10. Google Home其实是个错误
  11. am355x armlinux 移植openssh
  12. Halcon知识:binocular_disparity(双目视差)
  13. 爱因斯坦广义相对论:引力是时空的曲率
  14. HTML5期末大作业:山河旅行社网站设计——山河旅行社网站(5页) HTML+CSS+JavaScript 学生DW网页 出行 旅途 游玩
  15. 靖江最正宗过年习俗 只有3%的人完全继承下来了
  16. Keil中文显示设置
  17. 【HDU】1859 最小长方形
  18. FPGA(四):FPGA通过查表的方式生成正弦波
  19. 一些面经(1)---计算机网络、操作系统、测试
  20. 计算机系技能大赛策划案,计算机基本技能大赛”活动策划书

热门文章

  1. 编辑距离Edit distance
  2. 投资、理财、炒股记事
  3. Scipy教程 - 线性代数库scipy.linalg
  4. goods购物表MySQL的代码_python采用sqlachmy购物商城
  5. 力扣-1143 最长公共子序列/1035 不相交的线
  6. 打开终端报错:bash: /某路径/bashrc: No such file or directory
  7. Eclipse中如何让Java类与Servlet产生关联【实现处理请求内容】
  8. SDUT 2218 Give Me an E(规律)
  9. 基于react-app搭建react-router+redux项目
  10. Java Servlet(十一):一个servlet被10个浏览器客户端访问时会创建几个servlet实例?...