hdu1176 dp

题意:在一条 0 ~ 10 的坐标轴上,在整数点上会掉烙饼,一个人第 0 秒站在坐标 5 处,每秒他能够左右移动一个单位的坐标或不移动,并接住该坐标位置当前时间落下的烙饼,(例如第0秒他在坐标5处,第一秒他能在坐标4或5或6处,并接到该点第一秒落下的饼,同一个点同一秒可以落下多个饼),问最多能够接到多少饼

我的做法是以 dp [ i ] [ j ] 表示在坐标 i 处第 j 秒能接到的饼的最优情况。转移时由上一秒种能够移动到 i 点的最大 dp 值转移过来,并且加上当前能够拿到的最大值(这是我的第一思路,但事实上题目描述并不是这样,他只能捡到他移动到的点当前时间掉落的烙饼,而我以为可以捡到左中右三格上最大的一格,所以orzWA五连发```)。

dp[ i ] [ j ] = max ( dp [ i - 1 ] [ j - 1 ] , dp [ i ] [ j - 1 ] , dp [ i + 1 ] [ j - 1 ] ) + a [ i ] [ j ];当然, i + 1, i - 1 都必须保证在 0 ~ 10 范围内且第 j - 1 秒是能够达到的。

当然,我看其他人的题解其实都是从最后一秒向第 0 秒推,我看完之后也觉得可能比我的做法更加优化,因为这样就不需要考虑那一秒的时候是否能够达到那个点了。

自己还是太弱了,中问题都看不懂了啊!

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define max(a,b) a>b?a:b
 4
 5 int a[11][110000],dp[12][110000];
 6
 7 int main(){
 8     int n;
 9     while(scanf("%d",&n)!=EOF&&n!=0){
10         memset(a,0,sizeof(a));
11         memset(dp,-1,sizeof(dp));
12         int i,j,x,t,m=0,k,ans=0;
13         for (i=1;i<=n;i++){
14             scanf("%d%d",&x,&t);
15             a[x][t]++;
16             if(t>m)m=t;
17         }
18         dp[5][0]=a[5][0];
19         ans=max(ans,dp[5][0]);
20 /*        dp[5][1]=max(a[5][1],a[4][1]);
21         dp[5][1]=max(dp[5][1],a[6][1]);
22         ans=dp[5][1];
23         dp[5][1]=dp[5][0];
24         dp[5][1]+=a[5][1];
25         ans=max(dp[5][1],ans);
26 */        for(t=1;t<=m;t++){
27             for(i=0;i<=10;i++){
28                 for(j=i-1;j<=i+1;j++){
29                     if(0<=j&&j<=10&&dp[j][t-1]>=0){
30                         dp[i][t]=max(dp[i][t],dp[j][t-1]);
31                     }
32                 }
33 /*                int m0=0;
34                 for(j=i-1;j<=i+1;j++){
35                     if(0<=j&&j<=10){
36                         m0=max(m0,a[j][t]);
37                     }
38                 }
39 */                if(dp[i][t]>=0){
40                 /*    int m0=0;
41                     for(j=i-1;j<=i+1;j++){
42                         if(0<=j&&j<=10){
43                             m0=max(m0,a[j][t]);
44                         }
45                     }*/
46                     dp[i][t]+=a[i][t];
47                 }
48 //                dp[i][t]+=m0;
49                 ans=max(ans,dp[i][t]);
50             }
51         }
52         printf("%d\n",ans);
53     }
54     return 0;
55 }

时间: 2024-08-01 22:46:06

hdu1176 dp的相关文章

HDU1176 DP 数塔

看了大牛的代码后恍然大悟,然后自己开始写,WA了一下午! 这里有两个坑,让我找了一下午! AC代码: #include <iostream>#include <stdio.h>#include <stdlib.h>#include<string.h>#include<iostream>#include<string.h>#include<algorithm>const int maxn = 100000+5;int dp[

hdu1176(dp)

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25409    Accepted Submission(s): 8644 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10

HDU1176 免费馅饼(简单dp)

题意:一开始在5,每分钟可以接附近3个地方其中一个的东西,问最多接到多少个. 思路:倒着一遍就可以了 /* *********************************************** Author :devil Created Time :2015/12/22 20:50:26 ************************************************ */ #include <iostream> #include <algorithm>

HDU1176:免费馅饼(dp,数字三角形的应用)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1176 这题就是数字三角行的变形,可惜对于我这个渣渣来说就是没发现,区别是他可以保持在三个点,他左边的点,右边的点,还有原点, 从下往上处理.其他就没有什么好说的了,注意一下细节问题,我记得这题我白白贡献了几次WA. #include <iostream> #include <stdio.h> #include <string.h> #include <math.h>

hdu1176 免费馅饼 ( 数塔(DP))

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 32770    Accepted Submission(s): 11169 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的

hdu-1176(dp)

解题思路:用dp做的,dp[i][j]表示在i时刻,j点的最大馅饼.a[i][j]表示在i这个时刻j点同时掉落的馅饼: 每个点除了0和10之外,都有三种状态: 1.没有移动,这样值就为dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i][j]); 2.从左边移动来的,dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i][j]); 3.从右边移动来的,dp[i][j]=max(dp[i][j],dp[i-1][j+1]+a[i][j]); 初始化dp

[HDU1176]免费馅饼(DP)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1176 题解 DP.因为起点固定,终点随意,所以从终点到起点的顺序dp. 代码 import java.util.Scanner; public class FreePie { static final int MAXT=100005; static final int MAXLEN=10; public static void main(String args[]) { Scanner in=new

HDU-1176(基础方程DP)

Problem Description 都 说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉, 就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由于小径两侧都不能站人,所以他只能在 小径上接.由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围 内接住坠落的馅饼.

HDU1176

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41379    Accepted Submission(s): 14184 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1