Dynamic Programming?老牛吃药

博客内容讲述了如何使用动态规划解决一个关于医生给牛吃药的问题,牛在奇数和偶数次跳跃时会获得或损失能量。博主分享了自己最初的思路以及其他人采用二维数组动态规划的方法来找到牛能获取的最大能量。代码示例展示了如何实现这一算法。
摘要由CSDN通过智能技术生成

https://vjudge.net/contest/430905#problem/A
医生给牛吃药,使牛可以跳起来,跳到他想去的地方,从零开始,奇数次的时候是得到格子里的能量,偶数次是失去能量。可以间隔跳。
问它最大能得到多少能量。
我实在是不懂动态规划,一开始只能想到判断一个数的两边是不是都比他大,或者都小,才能得到最值。不贴这个代码了。
还是说下别人写的吧。
又是用了一个二维数组,一行储存偶数时候的值,另一行储存奇数时候的值。
不画图都看不懂原理。偶数行记录的是上一个奇数次的值减去这个数和上一个偶数次的值中选择大数。奇数行同理,改为加即可。
在这里插入图片描述

#include<iostream>
using namespace std;
int max(int a,int b)
{
    if(a>b) return a;
    else return b;
}
int main()
{

    int n;
    while(cin >> n)
    {
        int a[150006]= {0};
        int d[150006][2]={0};
        for(int i=1; i<=n; i++)
        {
            cin >> a[i];
        }
        for(int i=1; i<=n; i++)
        {
            d[i][0]=max(d[i-1][0],d[i-1][1]-a[i]);
            //判断上一个偶数次和上一个奇数次减去这个数谁大
            d[i][1]=max(d[i-1][1],d[i-1][0]+a[i]);
            //判断上一个奇数次和上一个偶数次加上这个数谁大
        }
        cout << max(d[n][0],d[n][1])<< endl;
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值