洛谷 P11246 [GESP202409 六级] 小杨和整数拆分(记忆化搜索和动态规划,两种方法)
记忆化搜索:
#include<bits/stdc++.h>
using namespace std;
int a[400], dp[100010], N, len;
int dfs(int be, int x){
if(x == 0) return 0;
if(dp[x]) return dp[x];
dp[x] = 0x7fffffff;
for(int i = be; i <= len && a[i] <= x; i++){
dp[x] = min(dp[x], dfs(be, x - a[i]) + 1);
}
return dp[x];
}
int main(){
cin >> N;
for(int i = 1; i <= N / i; i++) a[++len] = i * i;
cout << dfs(1, N);
return 0;
}
dp:
#include<bits/stdc++.h>
using namespace std;
int a[400], dp[100010], N, len;
int main(){
cin >> N;
for(int i = 1; i <= N / i; i++) a[++len] = i * i;
for(int i = 1; i <= N; i++){
dp[i] = i; //至少有一种情况是全1的
for(int j = 1; j <= len && a[j] <= i; j++){
dp[i] = min(dp[i], dp[i - a[j]] + 1);
}
}
cout << dp[N];
return 0;
}