usaco 1.5

来源:互联网 发布:中国陆军 知乎 编辑:程序博客网 时间:2024/04/30 11:07

chapter 1.5 的内容还是比较多的

Number Triangles: 简单的动态规划,方程:对自顶向下的总和sum sum[i][j] = max{sum[i-1][j], sum[i-1][j+1]} + number[i][j]

/*ID: zhangw31PROG: numtriLANG: C++*/#include <iostream>#include <algorithm>#include <fstream>using namespace std;const int MAXN = 1000 + 5;int v[MAXN][MAXN];int dp[MAXN][MAXN];ifstream fin("numtri.in");ofstream fout("numtri.out");int R, tmp;int main(){fin >> R;for (int i = 0; i < R; i++) {for (int j = 0; j < i + 1; j++) {fin >> v[i][j];}}dp[0][0] = v[0][0];for (int i = 0; i < R; i++) {for (int j = 0; j < i + 1; j++) {if (dp[i][j] + v[i+1][j] > dp[i+1][j]) dp[i+1][j] = dp[i][j] + v[i+1][j];if (dp[i][j] + v[i+1][j+1] > dp[i+1][j+1])dp[i+1][j+1] = dp[i][j] + v[i+1][j+1];}for (int j = 0; j < i + 1; j++) {cout << dp[i][j] << " ";}cout << endl;}sort(dp[R-1], dp[R-1] + R);fout << dp[R-1][R-1] << endl;}



Prime Palindromes:是一个巧妙的构造枚举,题目要求回文指质数,那么可以只构造一半,另一半通过对称即可,注意偶数和奇数位的对称

#include <cmath>#include <vector>#include <fstream>#include <cstdio>#include <algorithm>#include <string>#include <queue>#include <set>using namespace std;int a, b;vector<int> primepalin;bool isprime(int n){for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0) return false;}return true;}void solv(){primepalin.push_back(11);for (int i = 2; i <= 10000; i++) {int tmp = i/10;int sum;for (sum = i; tmp != 0; tmp /=10) {sum = sum * 10 + tmp % 10;}if (isprime(sum)) {primepalin.push_back(sum);}}}int main(){solv();sort(primepalin.begin(), primepalin.end());while(cin >> a >> b) {if (a == 0 && b == 0) break;for (int i = 0; i < primepalin.size(); i++) {if (primepalin[i] < a) continue;if (primepalin[i] > b) break;printf("%d\n", primepalin[i]);}}}

Superprime Rib:也是一道枚举题,求X位数中的一些数:满足前两位是质数,3位也是,等等那么从最高位开始构造就行了


/*ID: zhangw31PROG: sprimeLANG: C++*/#include <iostream>#include <cmath>#include <fstream>using namespace std;ifstream fin("sprime.in");ofstream fout("sprime.out");int N;bool isprime(int a) {for (int i = 2; i <= sqrt(a); i++) {if (a % i == 0) return false;}return true;}void dfs(int n, int deep) {if (!isprime(n)) return;if (deep == N) {fout << n << endl;return;}n *= 10;for (int i = 0; i < 10; i++) {dfs(n + i, deep + 1);}}int main(){fin >> N;dfs(2, 1);dfs(3, 1);dfs(5, 1);dfs(7, 1);}

checker challege: n皇后问题,关键在于斜线上的判断,dfs功底不足啊。。

/*ID: zhangw31PROG: checkerLANG: C++*/#include <iostream>#include <fstream>#include <algorithm>#include <cstdio>using namespace std;ifstream fin("checker.in");ofstream fout("checker.out");const int MAXN = 50;bool col[MAXN];bool dialeft[MAXN];bool diaright[MAXN];int N, counter;int tmp[MAXN];void dfs(int i) {if (i == N + 1) {if (counter < 3) {for (int i = 1; i <= N; i++) {fout << tmp[i];if (i != N) fout << " ";}fout << endl;}counter ++;}for (int j = 1; j <= N; j++) { if (col[j] || dialeft[j-i+N] || diaright[i+j]) continue;col[j] = dialeft[j-i+N] = diaright[i+j] = true;tmp[i] = j;dfs(i + 1);col[j] = dialeft[j-i+N] = diaright[i+j] = false;}}int main(){fin >> N;dfs(1);fout << counter << endl;}



0 0
原创粉丝点击