问题标题: 酷町堂:4232 伐木 WA0分代码求助

0
0
已解决
王子健
王子健
初级天翼
初级天翼

4232   伐木        经验值:800

题目描述 Description

在林场中种着一排共n棵杨树。每棵杨树都有一个价值vi。现在木材公司要砍掉其中的一些杨树带回去加工。由于林场要求,不能连续砍掉两棵相邻的杨树。请问这些杨树最多能获得的价值是多少。

输入描述 Input Description

第一行,一个整数n
第二行,n个整数,分别表示砍第i棵杨树能获得的价值。

输出描述 Output Description

最多能获得的价值

样例输入 Sample Input

4 1 2 3 1

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

2≤n≤1000,0≤vi≤999

 

又炸了又炸了,0分代码,样例过了。代码如下:

#include <iostream>
using namespace std;
int n, a[1010], maxn = -1;
int main() {
    cin >> n;
    for(int i=1; i<=n; i++) {
        cin >> a[i];
    }
    for(int i=1; i<=n; i++) {
        for(int j=i+2; j<=n; j++) {
            maxn = max(a[i] + a[j], maxn);
        }
    }
    cout << maxn;
    return 0;
}

大佬帮改

王子健在2020-08-29 07:32:02追加了内容
#include <iostream>
using namespace std;
int f[1001], a[1001];
int main() {
    int n;
    cin >> n;
    for(int i=1; i<=n; i++) {
        cin >> a[i];
    }
    f[1] = a[1];
    for(int i=1; i<=n; i++) {
        for(int j=i+2; j<=n; j++) {
            f[i] = max(f[i-1], max(f[j] + a[i]));
        }
    }
    cout << f[n];
    return 0;
}

赵逸凡大佬给的看不懂啊/kk,

@赵逸凡 

 


0
已采纳
吕牧原
吕牧原
高级守护
高级守护

不需二维,循坏结束

0
赵逸凡
赵逸凡
初级启示者
初级启示者
  • 定义:f[i]表示砍前i棵树能获得的最大价值
  • 状态:f[i]=max(f[i-1],max(f[j]+a[i]))
  • 边界:f[1]=a[1]
  • 目标:f[n]

话说这么水的动规题直接暴力dp不就行了吗,我的写法还能加以优化,但完全没必要

赵逸凡在2020-08-26 10:25:19追加了内容

@黄子扬 我的写法是从1年前复制过来的,当时我没理解透dp的奥妙,max(f[j]+a[i])中的f[j]是循环枚举的,因此套max,后来发现如果优化后根本没必要枚举f[j],所以说我太菜了

赵逸凡在2020-08-26 10:27:01追加了内容

@王子健 状态转移方程是对的,只不过可以加些优化

 

0
张恩泽
张恩泽
高级天翼
高级天翼

还行,思路如下:

输入

处理

输出

【狗头保命】

0
郑金顺
郑金顺
中级光能
中级光能

不难,排一下序,循坏一下结束

0
董子墨
董子墨
中级天翼
中级天翼

不一定只能砍2棵树

状态:f[i][1]处理前i棵树,第i棵树必砍,所获得的最大价值

f[i][0]处理前i棵树,第i棵树不砍,所获得的最大价值

其它自己推

0
高子健
高子健
新手天翼
新手天翼

开微课不好吗??

(有限时优惠假0元)

我要回答