每一个状态,可以由dp[i-1] 和 dp[i-5] 和 dp[i-7]这三种状态 +1 转移过来
分别枚举三种状态取最小值
答案即为最优解
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 1e6+10; const int M = 998244353; int dp[N]; void solve() { int n; cin>>n; dp[1] = 1; for(int i=1;i<=n;i++) { dp[i] = dp[i-1] + 1; if(i>=5) dp[i] = min(dp[i],dp[i-5]+1); if(i>=7) dp[i] = min(dp[i],dp[i-7]+1); } cout<<dp[n]; } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int _ = 1; // cin >> _; while(_--) solve(); return 0; }