枚举的优化:1)减少枚举变量,以计算代枚举2)使用哈希预处理可行解
四平方和四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^27 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意对于一个给定的正整数,可能存在多种平方和的表示法。)要求你对4个数排序:0 <= a <= b <= c <= d并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法程序输入为一个正整数N (N<5000000)
A.分析变量范围:a:0 ~ sqrt(5000000 / 4)b:0 ~ sqrt(5000000 / 3)c:0 ~ sqrt(5000000 / 2)d: 0 ~ sqrt(500000)已知N=a^2+b^2+c^2+d^2 B.先预处理出c^2+d^2=R的可行解,保存在哈希表里。java定义哈希:HashMap<Integer,Integer> f=new HashMap<Integer,Integer>();key:c*c+d*d value:c
HashMap方法void clear()Object clone()boolean containsKey(Object key)boolean containsValue(Object value)Set<Entry<K, V>> entrySet()V get(Object key)boolean isEmpty()Set<K> keySet()V put(K key, V value)void putAll(Map<? extends K, ? extends V> map)V remove(Object key)int size()Collection<V> values()HashMap不支持Iterator所以要通过其他方式迭代Map中的Key和Value
C.枚举a,b根据a,b求得的 c^2+d^2的和查找哈希表 ,若找到即为所求总结:减少变量+Hash预处理+查找枚举时应用哈希:以空间换时间查找一个东西存不存在是我们经常遇到的一个基本问题哈希(hash):把将来需要查找的值预先保存起来,减少查找时间。
package 四平方和;
import java.util.HashMap;
import java.util.Scanner;
/**
* 枚举方法+哈希优化
* 对HashMap的应用
* @author dell-
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
@SuppressWarnings("resource")
Scanner in=new Scanner(System.in);
n=in.nextInt();
HashMap<Integer,Integer> f=new HashMap<Integer,Integer>();
for(int c=0;c*c*2<=n;c++){
for(int d=c;d*d+c*c<=n;d++){
if(!f.containsKey(c*c+d*d)){
f.put(c*c+d*d, c);
}
}
}
for(int a=0;a*a*4<=n;a++){
for(int b=a;(b*b+a*a)<=n/2;b++){
if(f.containsKey(n-a*a-b*b)){
int c=f.get(n-(a*a+b*b));
int d=(int)(Math.sqrt(n-a*a-b*b-c*c)+1e-3);
System.out.println(a+" "+b+" "+c+" "+d);
break;
}
}
}
}
}