倒序遍历dp
怎么优化到log
#include <bits/stdc++.h>
using namespace std;
const int N = 10010, K = 510;
int n, k, a[N], dp[N][K];
int main(){
cin >> n >> k;
for (int i = 1;i <= n;i ++) cin >> a[i];
a[n + 1] = 0x3f3f3f3f;
for (int i = n;i >= 1;i --){
for (int c = 0; c <= k;c ++){
dp[i][c] = dp[i + 1][c];
for (int j = i + 1;j <= n + 1;j ++){
if (a[j] >= a[i]) dp[i][c] = max(dp[i][c], dp[j][c] + 1);
else if (c >= a[i] - a[j]) dp[i][c] = max(dp[i][c], dp[j][c - (a[i] - a[j])] + 1);
}
}
}
cout << dp[1][k];
return 0;
}