1103 Integer Factorization (30point(s)) 需要二刷 *存在DFS深度遍历爆栈和TLE问题

基本思想:

就是树形DFS遍历,没啥新意;

 

关键点:

最主要的是出现了一个问题,如果用for循环,在相同的剪枝条件和递归边界下,会遇到TLE和爆栈得风险;

 

后来和k神讨论,发现是for循环强行每次迭代枚举,多了很多不可能得情况;

例如如果第一位是6,后续每轮从6~0枚举,但是如果第一位变成5的话,后续还是从6~0枚举,所以会出现冗余情况,所以才会爆栈;

 

所以dfs还是要注意参数传递问题,递归边界也要设置一下;

 

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector> 
#include<string>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<set>
#include<stack>
using namespace std;

int n, k, p;

vector<vector<int>> res;
vector<int>r;
vector<int>ini;


int sq;
int max_num = 0;

bool cmp1(vector<int> a, vector<int> b) {
    string s1, s2;
    for (int i = 0; i < a.size(); i++) {
        s1 += a[i] + '0';
        s2 += b[i] + '0';
    }
    return s1 > s2;
}

void init() {
    //提前进行打表初始化
    ini.resize(sq+1);
    for (int i = 0; i <= sq; i++) {
        ini[i] = int(pow(i, p));
    }
}

void dfs(int index,int cnt, int cy,int sum) {
    if (cy == 0) {
        //如果到头了;
        if (cnt == n) {
            if (sum > max_num) {
                res.resize(0);
                res.push_back(r);
                max_num = sum;
            }
            else if (sum == max_num) {
                res.push_back(r);
            }
        }
        return;
    }
    while (index >= 0) {
        if (cnt + ini[index] <= n) {
            r.push_back(index);
            dfs(index, cnt + ini[index], cy - 1, sum + index);
            r.pop_back();
        }
        if (index == 1)
            return;
        index--;
    }
    //for (int i = ini.size()-1; i >0; i--) {
    //    if (cnt + ini[i] <= n) {
    //        r.push_back(i);
    //        dfs(cnt + ini[i], cy - 1,sum+i);
    //        r.pop_back();
    //        //cout << i << endl;
    //    }
    //}
}

int main() {
    cin >> n >> k >> p;
    sq = sqrt(n);
    init();
    dfs( sq,0, k,0);
    if (res.size() == 0) {
        cout << "Impossible" << endl;
        return 0;
    }
    sort(res.begin(), res.end(), cmp1);
    printf("%d = ",n);
    for (int i = 0; i < k; i++) {
        if (i == 0)
            printf("%d^%d", res[0][i], p);
        else
            printf(" + %d^%d", res[0][i], p);
    }
    return 0;
}

 

posted @ 2020-02-23 11:38  暮云林凌  阅读(286)  评论(0)    收藏  举报