免费馅饼

一道动态规划题目,讲述了主角在0-15米范围内每秒移动一米,随机捡馅饼的问题。解题关键在于理解状态转移方程,通过dp数组记录位置和时间,状态转移方程为dp[i][j] += max(dp[i+1][j], max(dp[i+1][j-1], dp[i+1][j+1]))。" 120440786,8407452,理解网络编程:TCP/IP协议、套接字与字节序解析,"['网络编程', 'TCP/IP协议', '套接字']
摘要由CSDN通过智能技术生成

原题地址
这道题是动态规划的基础题,但是有一些变形,于是刚学动态规划的我,就光荣的不会了。。。。
看着大佬们花式AC,心里不是滋味的我,上网看了一下题解
发现关于动态规划的问题,首先要思考一下他的状态转移方程式是什么,然后根据题意来推断出状态转移方程,接下来的事情就是用数组解决即可
这道题的题意是,一个蒻鶸每秒只能移动一米,然后在0-15米内随机掉馅饼,问这个人最多能拿多少
首先发现当前的位置是由前一秒的位置决定,前一秒的位置由前前一秒的位置决定,直到初始的5。所以,可以设一个数组dp来记录当前位置和当前时间。
其次因为移动分为x-1,x,x+1,且求得是累计的馅饼最大数
所以方程为dp[i][j]+=max(dp[i+1][j],max(dp[i+1][j-1],dp[i+1][j+1]));
代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <iomanip>
#include <string.h>
#include <sstream>
#define INF 999999999

using namespace std;
struct shi{
    int x;
    int T;
}s[100000];
int cmp(shi a,shi b){
    return a.x<b.x;
    }
long long cmd(long long a , long long  b){
    return a > b;
}
int dp[150000][17];
int a[100000];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        memset(dp,0,sizeof(dp));
        int sum=0;
        for(int i=0;i<n;i++)
        {
            int x , t;
            scanf("%d %d",&x,&t);
            dp[t][x+1]++;
            sum=max(sum,t);
        }
        for(int i=sum-1;i>=0;i--){
            for(int j=14;j>=0;j--)
                dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
        }
        printf("%d\n",dp[0][6]);

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值