如何解决找到写出从 0 到 n 等于 n 的值的平方和的最少方法数
#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;
}
- 我知道递推关系并尝试用笔和纸解决它。
当尝试输出 100 时,它比平时花费更多的时间。我已经花了至少 4 个小时,为什么语法没有错误并且它给出的结果小于 100 。 请帮忙。
解决方法
不清楚你想做什么。您声称方式总数,但实际上,您的代码计算等于 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。