给你一个正整数 num ,请你将它分割成两个非负整数 num1 和 num2 ,满足: num1 和 num2 直接连起来,得到 num 各数位的一个排列。 换句话说,num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。 num1 和 num2 可以包含前导 0 。 请你返回 num1 和 num2 可以得到的和的 最小 值。请用c++生成代码
时间: 2024-03-18 08:41:30 浏览: 48
以下是对应的 C++ 代码实现:
```cpp
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
int minSum(int num) {
string s = to_string(num);
int n = s.length();
vector<int> cnt(10);
for (char c : s) {
cnt[c-'0']++;
}
const int inf = 0x3f3f3f3f;
vector<vector<int>> dp(n+1, vector<int>(n+1, inf));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= i; j++) {
for (int k = 0; k <= j; k++) {
if (k > j-k) break;
if (i-j+k < j-k) continue;
if (k == 0 && j == 0) continue;
int num1 = accumulate(cnt.begin(), cnt.begin()+k, 0);
int num2 = accumulate(cnt.begin()+k, cnt.begin()+j-k, 0);
if (num1 == 0 && k > 0) continue;
if (num2 == 0 && j-k > 0) continue;
if (num1 > 0 && s[0] == '0') continue;
if (num2 > 0 && s[k] == '0') continue;
int val = dp[i-1][j-k] * 10 + (s[k]-'0');
dp[i][j] = min(dp[i][j], val);
}
}
}
return dp[n][n/2];
}
};
```
与 Python 代码类似,这里也是通过动态规划求解,时间复杂度为 $O(n^3)$,空间复杂度为 $O(n^2)$。
阅读全文