1 bool is_sqrt(int n){ 2 for(int i=1;i<=sqrt(double(n));i++){ 3 if(i*i == n) 4 return true; 5 } 6 return false; 7 } 8 int pow_number(int mp){ 9 int* a = new int[mp+1]; 10 a[0] = 1; 11 a[1] = 1; 12 if(mp==1) return 1; 13 if(is_sqrt(mp))return 1; 14 //int min = 0x8FFFFFFF; 15 for(int i=2;i<=mp;++i) 16 { 17 if(is_sqrt(i)){ 18 a[i]=1; 19 continue; 20 } 21 a[i] = a[1]+a[i-1]; 22 for(int j=i-1;j>=i/2;--j){ 23 a[i] = a[i]<(a[j]+a[i-j])?a[i]:(a[j]+a[i-j]); 24 } 25 } 26 int temp = a[mp]; 27 delete[] a; 28 return temp; 29 }
利用动态规划。