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 
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;
}


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