【003】平方求和
来源:互联网 发布:2016欧洲杯c罗数据 编辑:程序博客网 时间:2024/05/19 12:17
- 平方求和
- 题目描述
- 输入输出
- 示例输入
- 实例输出
- DFS Depth First Search
- cache优化
- 剪枝
- 深度剪枝
- 预测剪枝
- BFS Breath First Search
平方求和
题目描述
对于一个非负整数n,最少需要几个完全平方数,使其和为n?
输入输出
输入
- 第一行是n;如果n为-1,表示输入结束
输出
- 针对每组数据,输出最少需要的完全平方数
示例输入
3
4
5
-1
实例输出
3
1
2
DFS (Depth First Search)
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>using namespace std;class SqureSum {public: int search(int n) { if (n == 0) return n; int result = n; for (int i=1; i*i<=n; ++i) { int temp = search(n - i*i); if (temp + 1 < result) result = temp + 1; } return result; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); printf("%d Result %d ", n, ss.search(n)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 0.000000ms
4 Result 1 Time: 0.000000ms
5 Result 2 Time: 0.000000ms
6 Result 3 Time: 0.000000ms
7 Result 4 Time: 0.000000ms
8 Result 2 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 2 Time: 0.000000ms
21 Result 3 Time: 0.000000ms
31 Result 4 Time: 1.000000ms
41 Result 2 Time: 19.000000ms
51 Result 3 Time: 573.000000ms
61 Result 2 Time: 17303.000000ms
cache优化
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>#include <map>using namespace std;class SqureSum {private: map<int, int> cache;public: int search(int n) { if (n == 0) return n; if (cache.find(n) != cache.end()) return cache[n]; int result = n; for (int i=1; i*i<=n; ++i) { int temp = search(n - i*i); if (temp + 1 < result) result = temp + 1; } cache[n] = result; return result; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); printf("%d Result %d ", n, ss.search(n)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 0.000000ms
4 Result 1 Time: 0.000000ms
5 Result 2 Time: 0.000000ms
6 Result 3 Time: 0.000000ms
7 Result 4 Time: 0.000000ms
8 Result 2 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 2 Time: 0.000000ms
21 Result 3 Time: 0.000000ms
31 Result 4 Time: 0.000000ms
41 Result 2 Time: 0.000000ms
51 Result 3 Time: 0.000000ms
61 Result 2 Time: 0.000000ms
101 Result 2 Time: 0.000000ms
1001 Result 3 Time: 14.000000ms
10001 Result 2 Time: 560.000000ms
剪枝
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>#include <map>#include <cmath>using namespace std;class SqureSum {private: map<int, int> cache;public: int search(int n) { if (n == 0) return n; if (cache.find(n) != cache.end()) return cache[n]; int result = n; int ceil = (int)(sqrt(n)); if (ceil * ceil == n) { cache[n] = 1; return 1; } for (int i=ceil; i>0; --i) { int temp = search(n - i*i); if (temp + 1 < result) result = temp + 1; } cache[n] = result; return result; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); printf("%d Result %d ", n, ss.search(n)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 0.000000ms
4 Result 1 Time: 0.000000ms
5 Result 2 Time: 0.000000ms
6 Result 3 Time: 0.000000ms
7 Result 4 Time: 0.000000ms
8 Result 2 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 2 Time: 0.000000ms
21 Result 3 Time: 0.000000ms
31 Result 4 Time: 0.000000ms
41 Result 2 Time: 0.000000ms
51 Result 3 Time: 0.000000ms
61 Result 2 Time: 0.000000ms
101 Result 2 Time: 0.000000ms
1001 Result 3 Time: 15.000000ms
10001 Result 2 Time: 540.000000ms
100001 Result 3 Time: 21555.000000ms
深度剪枝
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>#include <map>#include <cmath>using namespace std;class SqureSum {private: map<int, int> cache; int best = 999;public: int search(int n, int depth) { if (n == 0) return n; if (cache.find(n) != cache.end()) return cache[n]; if (depth > best) return n; int result = n; int ceil = (int)(sqrt(n)); if (ceil * ceil == n) { cache[n] = 1; if (best > depth) best = depth; return 1; } for (int i=ceil; i>0; --i) { int temp = search(n - i*i, depth + 1); if (temp + 1 < result) result = temp + 1; if (best > temp+depth) best = temp + depth; if (temp == 1) break; } cache[n] = result; return result; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); printf("%d Result %d ", n, ss.search(n, 0)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 0.000000ms
4 Result 1 Time: 0.000000ms
5 Result 2 Time: 0.000000ms
6 Result 3 Time: 0.000000ms
7 Result 4 Time: 0.000000ms
8 Result 2 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 2 Time: 0.000000ms
21 Result 3 Time: 0.000000ms
31 Result 4 Time: 0.000000ms
41 Result 3 Time: 0.000000ms
51 Result 3 Time: 0.000000ms
61 Result 13 Time: 0.000000ms
101 Result 2 Time: 0.000000ms
1001 Result 3 Time: 0.000000ms
10001 Result 2 Time: 0.000000ms
100001 Result 3 Time: 1.000000ms
1000001 Result 2 Time: 0.000000ms
10000001 Result 3 Time: 0.000000ms
100000001 Result 2 Time: 0.000000ms
预测剪枝
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>#include <map>#include <cmath>using namespace std;class SqureSum {private: map<int, int> cache; int best = 999;public: int search(int n, int depth) { if (n == 0) return n; if (cache.find(n) != cache.end()) return cache[n]; if (depth > best) return n; int result = n; int ceil = (int)(sqrt(n)); if (ceil * ceil == n) { cache[n] = 1; if (best > depth) best = depth; return 1; } if (depth + 1 < best) { for (int i = ceil; i > 0; --i) { int temp = search(n - i * i, depth + 1); if (temp + 1 < result) result = temp + 1; if (best > temp + depth) best = temp + depth; if (temp == 1) break; } } cache[n] = result; return result; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); printf("%d Result %d ", n, ss.search(n, 0)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 1.000000ms
4 Result 1 Time: 0.000000ms
5 Result 5 Time: 0.000000ms
6 Result 6 Time: 0.000000ms
7 Result 7 Time: 0.000000ms
8 Result 8 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 10 Time: 0.000000ms
21 Result 21 Time: 0.000000ms
31 Result 31 Time: 0.000000ms
41 Result 41 Time: 0.000000ms
51 Result 51 Time: 0.000000ms
61 Result 61 Time: 0.000000ms
101 Result 101 Time: 0.000000ms
1001 Result 1001 Time: 0.000000ms
10001 Result 10001 Time: 0.000000ms
100001 Result 100001 Time: 0.000000ms
1000001 Result 1000001 Time: 0.000000ms
10000001 Result 10000001 Time: 0.000000ms
100000001 Result 100000001 Time: 0.000000ms
BFS (Breath First Search)
#include <iostream>#include <cstdio>#include <fstream>#include <ctime>#include <map>#include <cmath>#include <queue>using namespace std;class SqureSum {private: map<int, int> cache; int best = 999;public: int search(int n, int depth) { if (n == 0) return n; if (cache.find(n) != cache.end()) return cache[n]; if (depth > best) return n; int result = n; int ceil = (int)(sqrt(n)); if (ceil * ceil == n) { cache[n] = 1; if (best > depth) best = depth; return 1; } if (depth + 1 < best) { for (int i = ceil; i > 0; --i) { int temp = search(n - i * i, depth + 1); if (temp + 1 < result) result = temp + 1; if (best > temp + depth) best = temp + depth; if (temp == 1) break; } } cache[n] = result; return result; } int bfs(int n) { queue<int> q; q.push(n); q.push(-1); int need = 1; while (!q.empty()) { int tmp = q.front(); q.pop(); if (tmp < 0) { q.push(tmp-1); ++need; } else { int ceil = (int)sqrt(tmp); if (ceil * ceil == tmp) break; for (int i=ceil; i>0; --i) { q.push(tmp - i*i); } } } return need; }};int main() { SqureSum ss; ifstream is("../input.txt"); int n; is >> n; while (n != -1) { clock_t start = clock(); // printf("%d Result %d ", n, ss.search(n, 0)); printf("%d Result %d ", n, ss.bfs(n)); clock_t end = clock(); printf("Time: %fms\n", (float)(end - start)/CLOCKS_PER_SEC*1000); is >> n; } return 0;}
输出
3 Result 3 Time: 0.000000ms
4 Result 1 Time: 0.000000ms
5 Result 2 Time: 0.000000ms
6 Result 3 Time: 0.000000ms
7 Result 4 Time: 0.000000ms
8 Result 2 Time: 0.000000ms
9 Result 1 Time: 0.000000ms
10 Result 2 Time: 0.000000ms
21 Result 3 Time: 0.000000ms
31 Result 4 Time: 0.000000ms
41 Result 2 Time: 0.000000ms
51 Result 3 Time: 0.000000ms
61 Result 2 Time: 0.000000ms
101 Result 2 Time: 0.000000ms
1001 Result 3 Time: 0.000000ms
10001 Result 2 Time: 0.000000ms
100001 Result 3 Time: 4.000000ms
1000001 Result 2 Time: 0.000000ms
10000001 Result 3 Time: 256.000000ms
100000001 Result 2 Time: 0.000000ms
- 【003】平方求和
- 平方求和
- 平方求和
- 自然数倒数平方求和
- hihocoder 1372 平方求和
- 平方求和问题
- Java 平方求和
- i平方求和趣解
- c的求和、阶乘、平方算法
- 多线程CUDA实例 167页 平方求和
- 用递归求i的平方,再求和
- hdu 4027Can you answer these queries?(线段树功能:平方减少,区间求和)
- hdu4027 Can you answer these queries?(线段树平方减少,区间求和)
- hdoj 4027 Can you answer these queries? 【线段树 区间减为平方 + 区间求和】
- 一个整数的每个数位都平方后求和,又得到一个整数,我们称这个整数为:位平方和。
- 求和
- 求和。
- 求和
- c++跨平台Windows编程
- Python爬虫数据处理
- ZigZag Conversion
- Android 如何完整的获取到用户已安装应用列表
- Linux下USB摄像头采集图像,液晶framebuffer显示
- 【003】平方求和
- 信源编码第五次作业
- kinetis FTM详解
- 光纤陀螺简介
- WIN7 32位 jstanford Java公开课 Karel机器人开发环境eclipse安装与配置
- 深入理解MessageQueue
- 无人机姿态融合——EKF
- 如何爬取国外网站
- (个人)AR电子书系统创新实训第五周(1)