小蒟蒻 2023-01-14 11:58 采纳率: 0%
浏览 96

C++:第二个不高兴的小明 80分,问题在哪?

题目:问题描述
  有一条长为 n 的走廊,小明站在走廊的一端,每次可以跳过不超过 p格,每格都有一个权值 wi
  小明要从一端跳到另一端,(从 0 号位置跳到 n + 1 号位置)不能回跳,最多不超过 t 次,请问他跳过的方格的权值和最大是多少?

输入格式
  输入的第一行包含三个整数 n, p, t,表示走廊的长度,小明每次跳跃的最长距离和小明可以跳的次数。 接下来 n 个整数,表示走廊每个位置的权值。

输出格式
  输出一个整数。表示小明跳过的方格的权值和的最大值。

样例输入
8 5 3
3 4 -1 -100 1 8 7 6

样例输出
12

数据规模
1 ≤ n, p, t ≤ 1000, -1000 ≤ wi ≤ 1000


本人得了80分,问题在哪里,求指教

#include <bits/stdc++.h>
using namespace std;

int a[1005];
long long dp[1005][1005];

int main() {
    int n, p, t;
    long long maxn = -9999;
    
    cin >> n >> p >> t;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    memset(dp, 128, sizeof(dp));
    
    for (int i = 0; i <= n + 1 && i <= p; i++) {
        dp[i][1] = a[i];
    }
    
    for (int i = 0; i <= n + 1; i++) {
        for (int j = 2; j <= t; j++) {
            for (int k = 1; k <= p && k < i; k++) {
                dp[i][j] = max(dp[i][j], dp[i - k][j - 1] + a[i]);
                
            }
        }
    }
    
    for (int i = 1; i <= t; i++) {
        maxn = max(maxn, dp[n + 1][i]);
    }
    
    cout << maxn;
    
    return 0;
}


  • 写回答

1条回答 默认 最新

  • 小刘较瘦 Python领域新星创作者 2023-01-14 16:31
    关注

    把dp数组定义为int类型,因为题目中权值都是int类型,所以答案也应该是int类型。然后,在初始化dp数组时,你用了memset,它会将所有元素都赋为-128,但是题目中wi的范围是-1000~1000,所以这样会导致答案不正确。你应该把dp数组初始化为INT_MIN,这样就可以保证初始值小于所有可能的答案。然后,你的第三层循环的判断条件应该是 k < i,而不是 k <= i。最后,你的输出应该是cout << maxn; 而不是 cout << dp[n + 1][t];。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月14日

悬赏问题

  • ¥50 python批量提取发票的信息
  • ¥15 mysql安装,初始化数据库失败
  • ¥15 虚幻五引擎内容如何上传至网盘?
  • ¥15 使用mmpose库时出现了问题
  • ¥15 IRI2016模型matlab运行报错
  • ¥50 bat怎么设置电脑后台自动点击网页指定词运行脚本,输入指定网页链接,指定点击词,指定间隔时间,指定网页出现的词,指定网页出现词出现后后点击锁定,放在后台运行不影响前台鼠标工作
  • ¥20 20CrMnMo的高温变形抗力
  • ¥15 RTX3.6 5565驱动中断报错
  • ¥50 带防重放token(Antireplay-Token)的网站怎么用Python发送请求
  • ¥15 visa版本没问题,串口调试助手调试串口正常使用,但是labview刷新不出来