鱼C论坛

 找回密码
 立即注册
查看: 2017|回复: 1

[已解决]dp求助

[复制链接]
发表于 2022-11-27 17:34:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 aaron0919 于 2022-11-27 20:10 编辑

捕获.PNG
我的code
#include<bits/stdc++.h>
using namespace std;
int a[100000],dp[100000];
int main(){                             
    int p,q,n;
    cin>>p>>q>>n;
    for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        dp[0]=p;
        dp[1]=p-q>=0?p-q+a[1]:-1e9;
        for(int i=2;i<=n+1;i++){
                int flag=0;
                if(dp[i-1]-q>=0){
                        dp[i]=max(dp[i],dp[i-1]-q+a[i]);
                        flag++;
                }
                if(dp[i-2]-q>=0){
                        dp[i]=max(dp[i],dp[i-2]-q+a[i]);
                        flag++;
                }
                if(!flag){
                        dp[i]=-1e9;
                }
        }
        if(dp[n+1]<=0){
                cout<<"NO";
        }else{
                cout<<dp[n+1];
        }
        return 0;      
}
只能八十分。。。
最佳答案
2022-11-28 17:00:55
本帖最后由 jhq999 于 2022-11-28 19:03 编辑
#include <stdio.h>
//int node[1000000];


int main()
{
    int i,P,Q,n,t,prv[3]= {0},cur=0; //cur是跳到当前位置消耗的最小量,
                                                    //prv[1]prv[2]是当前位置前两个位置消已经耗的能量
    scanf("%d%d",&P,&Q);
    scanf("%d",&n);
    prv[1]=0;
    scanf("%d",&prv[2]);
    prv[2]-=Q;
    for (i=2; i<=n; i+=1)
    {
        /*if((P+prv[1]<Q)&&((P+prv[2]<Q))
        {
                printf("NO");
                return 0;
        }*/
        
        if(prv[1]>prv[2])t=prv[1];//选前两个位置消耗最少的
        else t=prv[2];
        if(P+t<Q)
        {
                printf("NO");
                return 0;
        }
        scanf("%d",&cur);//当前位置的能量ai
        cur+=t-Q;//当前位置的能量ai减去跳一次消耗的能量再加上前两个能量消耗最少的
        prv[1]=prv[2];
        prv[2]=cur;

    }
    if(prv[1]>prv[2])t=prv[1];
    else t=prv[2];//终点前两个位置消耗最少的
    if(P+t<Q)
    {
                printf("NO");
                return 0;
     }
    printf("%d",P+t-Q);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-28 17:00:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-11-28 19:03 编辑
#include <stdio.h>
//int node[1000000];


int main()
{
    int i,P,Q,n,t,prv[3]= {0},cur=0; //cur是跳到当前位置消耗的最小量,
                                                    //prv[1]prv[2]是当前位置前两个位置消已经耗的能量
    scanf("%d%d",&P,&Q);
    scanf("%d",&n);
    prv[1]=0;
    scanf("%d",&prv[2]);
    prv[2]-=Q;
    for (i=2; i<=n; i+=1)
    {
        /*if((P+prv[1]<Q)&&((P+prv[2]<Q))
        {
                printf("NO");
                return 0;
        }*/
        
        if(prv[1]>prv[2])t=prv[1];//选前两个位置消耗最少的
        else t=prv[2];
        if(P+t<Q)
        {
                printf("NO");
                return 0;
        }
        scanf("%d",&cur);//当前位置的能量ai
        cur+=t-Q;//当前位置的能量ai减去跳一次消耗的能量再加上前两个能量消耗最少的
        prv[1]=prv[2];
        prv[2]=cur;

    }
    if(prv[1]>prv[2])t=prv[1];
    else t=prv[2];//终点前两个位置消耗最少的
    if(P+t<Q)
    {
                printf("NO");
                return 0;
     }
    printf("%d",P+t-Q);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表