题解:P11246 [GESP202409 六级] 小杨和整数拆分

· · 题解

清新的动态规划。

易列出状态转移方程 dp[i] = min(dp[i], dp[i - j * j] + 1)

解释在下面:

状态转移方程的含义

例如,当计算 dp[5] 时:

代码:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n;
    cin >> n;
    int dp[n + 1];
    for (int i = 0; i <= n; i++) {
        dp[i] = i;  // 初始化,最坏情况就是全是1相加
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j * j <= i; j++) {
            dp[i] = min(dp[i], dp[i - j * j] + 1);
        }
    }
    cout << dp[n] << endl;
    return 0;
}

可以的话,能不能点个关注和赞?