【问题标题】:find minimum number of ways to write the sum of square of value from 0 to n equals n找到从 0 到 n 的值的平方和等于 n 的最小方法数
【发布时间】:2021-06-09 12:55:38
【问题描述】:
#include<bits/stdc++.h>
using namespace std;
vector<int> memo;
class Solution{
    public:
    int minimum(int a , int b){
        if(a>b) return b;
        return a;
    }
    public:
    int MinSquares(int n , vector<int> memo)
    {
        if(n<= 3){
             return n;
        }
        if(memo[n]>-1) {
            return memo[n];
        }
        
        int m = n ;
        for(int i = 1 ; n-(i*i)>=0; i++){
            
            m = minimum(m, MinSquares(n - i*i , memo) + 1 );
        }
        memo[n]=m;
        return memo[n];
    }
    
    
};

// { Driver Code Starts.
int main(){
    int tc;
    cin >> tc;
    while(tc--){
        int n;
        cin >> n;
        Solution ob;
        vector<int> memo;
        memo.assign(n+1 ,-1);
        memo[0]=0;
        memo[1]=1;
        int ans = ob.MinSquares(n , memo);
        cout << ans <<"\n";
    }
    return 0;
}
  1. 我知道递归关系并尝试用笔和纸解决它。

当尝试输出 100 时,它比平时花费更多的时间。我花了至少 4 个小时,为什么语法没有错误,并且给出的结果少于 100 。 请帮忙。

【问题讨论】:

  • 看起来您正在尝试解决某种编程挑战 - 您能说明一下任务本身吗?
  • 您能举个例子吗?目前还不清楚你想做什么。您声称 方法总数,但实际上,您的代码计算平方和的最小长度等于 n。

标签: c++ algorithm c++11 c++17 dynamic-programming


【解决方案1】:

不清楚你想做什么。您声称​​方法总数,但实际上,您的代码计算平方和的最小长度等于 n

关于你提到的效率问题,问题就在这里:

int MinSquares(int n , std::vector<int> memo)

您不断复制memo。这是通过使用参考解决的

    int MinSquares(int n , std::vector<int>& memo)
#include <iostream>
#include <vector>

//vector<int> memo;
class Solution{
    public:
    int minimum(int a , int b){
        if(a>b) return b;
        return a;
    }
    public:
    int MinSquares(int n , std::vector<int>& memo) {
        if (n <= 3){
             return n;
        }
        if(memo[n] > -1) {
            return memo[n];
        }
        
        int m = n ;
        for(int i = 1 ; n-(i*i)>=0; i++){
            m = minimum (m, MinSquares(n - i*i , memo) + 1);
        }
        memo[n] = m;
        return memo[n];
    }
};

// { Driver Code Starts.
int main(){
    int tc;
    std::cin >> tc;
    while(tc--){
        int n;
        std::cin >> n;
        Solution ob;
        std::vector<int> memo;
        memo.assign(n+1 ,-1);
        memo[0] = 0;
        memo[1] = 1;
        int ans = ob.MinSquares(n , memo);
        std::cout << ans <<"\n";
    }
    return 0;
}

【讨论】:

  • 非常感谢。我非常感谢你。
  • 好。如果对您有帮助,请不要忘记接受此答案。
猜你喜欢
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2017-12-23
相关资源
最近更新 更多