ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1006 免费馅饼 动态规划 线性DP

2022-07-05 04:31:05  阅读:206  来源: 互联网

标签:游戏 收集 int 馅饼 DP 1006 dp


链接:https://ac.nowcoder.com/acm/contest/24213/1006
来源:牛客网

题目描述

  SERKOI最新推出了一种叫做“免费馅饼”的游戏:游戏在一个舞台上进行。舞台的宽度为W格,天幕的高度为H格,游戏者占一格。开始时游戏者站在舞台的正中央,手里拿着一个托盘。下图为天幕的高度为4格时某一个时刻游戏者接馅饼的情景。

游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或向右移动一格或两格,也可以站在原地不动。
馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。同时,在8-308电脑的遥控下,各种馅饼下落的速度也是不一样的,下落速度以格/秒为单位。
当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。
写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。


输入描述:

第一行是用空格隔开的两个正整数,分别给出了舞台的宽度W(1到99之间的奇数)和高度H(1到100之间的整数)。
接下来依馅饼的初始下落时间顺序给出了所有馅饼的信息。每一行给出了一块馅饼的信息。由四个正整数组成,分别表示了馅饼的初始下落时刻(0到1000秒),水平位置、下落速度(1到100)以及分值。游戏开始时刻为0。从1开始自左向右依次对水平方向的每格编号。
输入文件中同一行相邻两项之间用一个或多个空格隔开

输出描述:

第一行给出了一个正整数,表示你的程序所收集的最大分数之和。
其后的每一行依时间顺序给出了游戏者每秒的决策。输出0表示原地不动、1或2表示向右移动一步或两步、-1 或-2表示向左移动一步或两步。输出应持续到游戏者收集完他要收集的最后一块馅饼为止
示例1

输入

复制
3 3
0 1 2 5 
0 2 1 3
1 2 1 3
1 3 1 4

输出

复制
12
-1
1
1



分析

由于这道题要的是恰好某一秒,被主人公碰到的馅饼才能收集,所以把所有h-1%v 不等于0的全去掉

将所有馅饼按照落到地面的时间 t 来分层,位置来分该层的值。

从初始点由于从m/2+1位置出发来DP还要判断初始位置是不是m/2+1,把其它位置判掉很麻烦,所以直接逆序DP,最后输出DP[m/2+1][0]

 

线性DP却存了二维状态时间和位置,转移方程当前位置和转移量也不是固定的某个指针而是for(int i = 1;i<=w;i++) 和 for(int k = -2;i<=2;k++)

只能说稍微灵活一点的题,我连dp的方程都有点不会写

 

------------------------代码----------------------------

//#define int LL
const int N = 1005;
int w,h;
int dp[N][N];
int val[N][N];
int path[N][N];

void solve()
{
cin>>w>>h;
// V<V<int>>mp(n+1,V<int>(m+1));
int t,o,v,s;
int n = 0;
while(cin>>t>>o>>v>>s) {
if((h-1) % v) continue;
t += ((h-1) / v);
val[o][t] += s;
n = max(n,t);
}
for(int j = n;j>=0;j--) {//表示时间
for(int i = 1;i<=w;i++) {
for(int k = -2;k<=2;k++) {
if(k + i <1 || k + i > w) continue;
if(dp[i][j] < dp[i+k][j+1] + val[i][j]) {
dp[i][j] = dp[i+k][j+1] + val[i][j];
path[i][j] = k;
}
}
}
}

cout<<dp[(w / 2) + 1][0] <<endl;
int st = w / 2 + 1;
for(int i = 0;i< n;i++) {
cout<<path[st][i]<<endl;
st += path[st][i];
}
}

signed main(){
clapping();TLE;

// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}

/*样例区


*/

//------------------------------------------------------------

标签:游戏,收集,int,馅饼,DP,1006,dp
来源: https://www.cnblogs.com/er007/p/16445032.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有