您的位置:首页 > Web前端

DP问题:leetcode(279)Perfect Squares

2018-01-25 09:41 351 查看
问题描述:
Given a positive integer n, find the least number of perfect square numbers (for example,
1, 4, 9, 16, ...
) which sum to n.

For example, given n =
12
, return
3
because
12 = 4 + 4 + 4
; given n =
13
, return
2
because
13 = 4 + 9
.

emm.......感觉做这种涉及整数性质的题没什么灵感,总是找不到其中一些规律。无奈又是利用较为暴力的O(N^2)动态规划解决问题了。对于这种类型的问题以后还是先自己用较为粗糙的方式AC掉,再去看别人巧妙的解法吧,以免浪费过多的时间。

主要思路:设a[i]为整数i为perfect square numbers,那么i可以拆成两个数相加,设这两个数是j和k,即i=j+k,则a[i] = min { a[j]+a[k] }。注意j从1遍历到i-1会超时,实际上只用遍历到i/2就可以了。另外还要考虑一种特殊情况,就是当i为平方数的时候,需要直接返回1.

#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;

class Solution {
public:
int numSquares(int n) {
int a[10000];
a[1]=1;
int k,min,sqrn;
for(int i=2;i<=n;i++){
sqrn=sqrt(i);
if(sqrn*sqrn==i) a[i]=1;
else{
min=a[i-1]+1;
for(int j=1;j<=i/2;j++){
min=a[j]+a[i-j]<min?a[j]+a[i-j]:min;
}
a[i]=min;
}
}
return a
;
}

};

int main()
{
cout<<(new Solution())->numSquares(6405);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: