POJ 2385 Apple Catching
2016-03-22 22:47
211 查看
可以设计三维DP,dp[i][j][k]表示i秒的时候,走了j步,在编号为k的树下获得的最大价值。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int T,W; int dp[1200][40][3]; int a[2000]; int ans; void read() { for(int i=1;i<=T;i++) scanf("%d",&a[i]); } void init() { memset(a,-1,sizeof a); memset(dp,-1,sizeof dp); ans=0; } void work() { if(a[1]==1) dp[1][0][1]=1,dp[1][1][2]=0,ans=1; else dp[1][0][1]=0,dp[1][1][2]=1,ans=1; for(int i=1;i<=T;i++) { for(int j=0;j<=W;j++) { ans=max(ans,dp[i][j][1]); ans=max(ans,dp[i][j][2]); if(dp[i][j][1]!=-1) { //原地不动 if(a[i+1]==1) dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]+1); else dp[i+1][j][1]=max(dp[i+1][j][1],dp[i][j][1]); //移动到2 if(a[i+1]==2) dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]+1); else dp[i+1][j+1][2]=max(dp[i+1][j+1][2],dp[i][j][1]); } if(dp[i][j][2]!=-1) { //原地不动 if(a[i+1]==2) dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]+1); else dp[i+1][j][2]=max(dp[i+1][j][2],dp[i][j][2]); //移动到1 if(a[i+1]==1) dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]+1); else dp[i+1][j+1][1]=max(dp[i+1][j+1][1],dp[i][j][2]); } } } printf("%d\n",ans); } int main() { while(~scanf("%d%d",&T,&W)) { init(); read(); work(); } return 0; }
相关文章推荐
- Android Studio依赖包aar使用全攻略!
- android 双击事件的实现
- Android Material Design之Toolbar与Palette实践
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码
- UIWebView显示网页
- 音效与音乐
- OC中的load和initialize方法
- ExtJs之Ext.core.DomHelper.append
- iOS加密方式及解压缩文件
- ExtJs之Ext.apply
- swift 与oc 混编
- android颜色指列表
- android中RecyclerView使用自定义的列表布局
- Android——加载模式
- msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsign
- Android百度地图点聚合功能
- Android MediaServer初始化流程
- iOS一个项目开始创建, 部署到git服务器
- android颜色color.xml设置
- iOS开发-蓝牙模块