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
.
===================================================================
題目鏈接:https://leetcode.com/problems/perfect-squares/
題目大意:求n的最少平方和。
思路:動態規劃。dp[i] 表示i的最少平方和。
初始化dp數組:
vector <int> dp ( n + 1 , 0 ) ;
vector <int> v ;
for ( int i = 1 ; i <= sqrt ( n ) ; i ++ )
{
int p = i * i ;
dp[p] = 1 ;
v.push_back ( p ) ;
}
動態規劃:
int sz = v.size() ;
for ( int i = 2 ; i <= n ; i ++ )
{
int ans = INT_MAX ;
for ( int j = 0 ; j < sz ; j ++ )
{
if ( v[j] > i )
break ;
ans = min ( ans , 1 + dp[i-v[j]] ) ;
}
dp[i] = ans ;
}
參考代碼:
class Solution {
public:
int numSquares(int n) {
vector <int> dp ( n + 1 , 0 ) ;
vector <int> v ;
for ( int i = 1 ; i <= sqrt ( n ) ; i ++ )
{
int p = i * i ;
dp[p] = 1 ;
v.push_back ( p ) ;
}
int sz = v.size() ;
for ( int i = 2 ; i <= n ; i ++ )
{
int ans = INT_MAX ;
for ( int j = 0 ; j < sz ; j ++ )
{
if ( v[j] > i )
break ;
ans = min ( ans , 1 + dp[i-v[j]] ) ;
}
dp[i] = ans ;
}
return dp[n] ;
}
};