题目来源:https://leetcode.cn/problems/find-the-punishment-number-of-an-integer/
C++题解:单独写了个函数判断是否可以分割,判断方法为暴力法。然后更新惩罚数。
bool fin(vector<int> m, int tar) {
int len = m.size();
int sum = 0;
vector<int> tmp(0);
for(int ii = 0; ii < len; ii++) {
sum = sum + m[ii];
}
tmp.push_back(sum);
if(len == 4){
sum = m[0]*10 + m[1] + m[2] + m[3]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2]*10 + m[3]; tmp.push_back(sum);
sum = m[0] + m[1]*10 + m[2] + m[3]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*10 + m[3]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3]; tmp.push_back(sum);
sum = m[0] + m[1]*100 + m[2]*10 + m[3]; tmp.push_back(sum);
}
if(len == 5){
sum = m[0]*10 + m[1] + m[2] + m[3] + m[4]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2]*10 + m[3] + m[4]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2] + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2]*100 + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0] + m[1]*10 + m[2] + m[3] + m[4]; tmp.push_back(sum);
sum = m[0] + m[1]*10 + m[2] + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*10 + m[3] + m[4]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2] + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3] + m[4]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0] + m[1]*100 + m[2]*10 + m[3] + m[4]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*100 + m[3]*10 + m[4]; tmp.push_back(sum);
sum = m[0]*1000 + m[1]*100 + m[2]*10 + m[3] + m[4]; tmp.push_back(sum);
sum = m[0] + m[1]*1000 + m[2]*100 + m[3]*10 + m[4]; tmp.push_back(sum);
}
if(len == 6){
sum = m[0]*10 + m[1] + m[2] + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*10 + m[2] + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*10 + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2] + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2] + m[3] + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3] + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*100 + m[1]*10 + m[2] + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*100 + m[2]*10 + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*100 + m[2]*10 + m[3] + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*100 + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2]*100 + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2] + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2] + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*10 + m[2] + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*1000 + m[1]*100 + m[2]*10 + m[3] + m[4] + m[5]; tmp.push_back(sum);
sum = m[0]*1000 + m[1]*100 + m[2]*10 + m[3] + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*1000 + m[2]*100 + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1] + m[2]*1000 + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*10 + m[1] + m[2]*1000 + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
sum = m[0]*10000 + m[1]*1000 + m[2]*100 + m[3]*10 + m[4] + m[5]; tmp.push_back(sum);
sum = m[0] + m[1]*10000 + m[2]*1000 + m[3]*100 + m[4]*10 + m[5]; tmp.push_back(sum);
}
//cout<<tar*tar<<" "<<tar<<" ";
for(int kk = 0; kk < tmp.size(); kk++) {
//cout<<tmp[kk]<<" ";
if(tmp[kk] == tar) return true;
}
//cout<<endl;
return false;
}
class Solution {
public:
int punishmentNumber(int n) {
int res = 0;
if(n <= 8) return 1;
else if(n == 9) return 82;
else if(n <= 35) return 182;
else res = 1478;
if(n == 1000){ n--; res = res + 1000000;}
for(int ii = 37; ii <= n; ii++) {
int tem = ii * ii;
vector<int> m(0);
while(tem > 0){
m.push_back(tem % 10);
tem = (tem - tem % 10) / 10;
}
reverse(m.begin(), m.end());
if(fin(m, ii)) res = res + ii * ii;
}
return res;
}
};
//45 3503 297-184768 414-772866
C++题解2:使用DFS深度优先搜索算法,还没学,先放着。
class Solution {
public:
string s;
int punishmentNumber(int n) {
int ans = 0;
function<bool(int, int, int, int)> dfs = [&](int x, int start, int len, int sum) -> bool {
/* 提前返回 */
if (sum > x) {
return false;
}
if (start == len) {
if (sum == x) { /* 处理到最后一个, 可以等于原数 */
return true;
}
return false;
}
int tmp = 0;
for (int j = start; j < len; j++) { /* 枚举分割点 */
tmp = tmp * 10 + s[j] - '0';
if (dfs(x, j + 1, len, sum + tmp)) {
return true;
}
}
return false;
};
for (int i = 1; i <= n; i++) {
s = to_string(i * i);
if (dfs(i, 0, s.size(), 0)) {
ans += i * i;
}
}
return ans;
}
};
作者:linge32
链接:https://leetcode.cn/problems/find-the-punishment-number-of-an-integer/solutions/2278318/c-dfs-by-liu-xiang-3-bhzl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。