我的方法,感觉思路不够清晰,不过还是有进步的。对DP有种莫名的恐惧,下次加油。
class Solution { public: int numSquares(int n) { // n=8; if(n<=3) return n; vector <int> dp(n+1,INT_MAX);//初始值是多少 //dp[0]=1; dp[1]=1; dp[2]=2; dp[3]=3; for(int i=0;i*i<=n;i++) dp[i*i]=1; int j=0; for(int i=4;i<=n;i++) { int tmp=(int)sqrt(i); while(tmp>=0) { j=i-tmp*tmp; tmp--; if(j==0) { dp[i]=1; break; } else //if(dp[j]!=INT_MAX) { //printf("1113"); dp[i]=min(dp[j]+1,dp[i]);//?dp[j]+1:dp[i]; } } // printf("dp[%d]=%d\n",i,dp[i]); } return dp[n]; } };
这样的思路才是清晰的。
class Solution { public: int numSquares(int n) { if(n<=3) return n; vector <int> dp(n+1,INT_MAX);//初始值是多少 for(int i=1;i*i<=n;i++) dp[i*i]=1; int j=0; dp[0]=0; dp[1]=1; dp[2]=2; dp[3]=3; for(int i=4;i<=n;i++) { for(int j=1;j*j<=i;j++) { dp[i]=min(dp[i-j*j]+1,dp[i]); } } return dp[n]; } };