线性DP动态规划
例题1代码:
//5 //7 //3 8 //8 1 0 //2 7 4 4 //4 5 2 6 5 #include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 105; ll a[N][N], dp[N][N]; int main() { int n; cin >> n; for (int i=1;i<=n;++i) for (int j = 1; j <= i; ++j)cin >> a[i][j]; for (int i=n;i>=1;--i) for (int j = 1; j <= i; ++j) dp[i][j] = a[i][j] + max(dp[i + 1][j], dp[i + 1][j + 1]); cout << dp[1][1] << "\n"; return 0; }
例题2
6 1 3 #include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e5+9; const ll p = 1e9 + 7; ll dp[N]; bool broken[N]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, m; cin >> n >> m; for (int i = 1; i <= m; ++i){ int x; cin >> x; broken[x] = true; } dp[0] = 1; if (!broken[1])dp[1] = 1; for (int i = 2; i <= n; ++i){ if (broken[i])continue; dp[i] = (dp[i - 1] + dp[i - 2]) % p; } cout << dp[n] << "\n"; return 0; }
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
const ll p = 1e9 + 7;
ll dp[N], prefix[N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, k; cin >> n >> k;
dp[0] = prefix[0] = 1;
for (int i = 1; i <= n; i++){
if (i - k - 1 < 1)dp[i] = 1;
else dp[i] = prefix[i - k - 1];
prefix[i] = (prefix[i - 1] + dp[i]) % p;
}
cout << prefix[n] << "\n";
return 0;
}