Section 1.5 也许这才是暴力搜索

Number Triangles

经典DP。

自控老师曾经用了一节课讲这道题。。我以为我早就懂了,居然听不懂那一堆奇怪的公式。果然自控是天书。

#include <bits/stdc++.h>
using namespace std;
const int N = 1004;
int f[N][N], dp[N][N];
int main()
{

    freopen("numtri.in","r",stdin);
    #ifndef poi
    freopen("numtri.out","w",stdout);
    #endif
    int n, i, j;
    scanf("%d", &n);
    for(i = 1; i <= n; i++){
        for(j = 1; j <= i; j++) scanf("%d", &f[i][j]);
    }
    for(i = n; i >= 1; i--){
        for(j = 1; j <= i; j++){
            dp[i][j] = max(dp[i][j], max(dp[i+1][j], dp[i+1][j+1])+f[i][j]);
        }
    }
    cout << dp[1][1]<<endl;
    return 0;
}

Prime Palindromes

找出[a,b]区间内所有回文的素数

还没从简单题的气氛里醒过了,一开始以为爆搞,看了下数据范围= =

思考了一下,奇数偶数长度一起搞有一些麻烦,想分开来搞,后来感受到了。。

小学奥数姿势:怎么看出一个数是不是11的倍数。可以发现偶数长度的一定是11的倍数,所以只有11是可行的。

这样就处理一下奇数长度就好了。

DFS一下,然后判断。

#include <bits/stdc++.h>
using namespace std;

vector<int>v;
int factor[13];
bool isprime(int x){
    int m = sqrt(x) + 1;

    for(int i = 2; i <= m; i++){
        if(x % i == 0)   return false;
    }
    return true;
}
void dfs(int len, int now){
    if(len >= 8) return;
    if(isprime(now)){
        v.push_back(now);

    }

    for(int i = 0; i <= 9; i++){
        dfs(len + 2, now * 10 + factor[len]*i+i);
    }
}
int main()
{
    freopen("pprime.in","r",stdin);
    #ifndef poi
    freopen("pprime.out","w",stdout);
    #endif
    int a, b, i;
    cin >> a>> b;
    factor[1] = 100;

    for(i = 2; i <= 7; i++) factor[i] = factor[i-1]*10;

    for(i = 0; i <= 9; i++){
        dfs(1, i);
    }
    v.push_back(11);
    sort(v.begin(), v.end());

    for(i = 0; i < v.size(); i++){
        if(v[i] >= a && v[i] <= b)  printf("%d\n", v[i]);
    }
    return 0;
}

Superprime Rib

对于一个N位数,使得前1,2,3,。。。N位都是素数

爆搜

#include <bits/stdc++.h>
using namespace std;
vector<int>v;
int n;

bool isprime(int x){
    int m = sqrt(x);

    for(int i = 2; i <= m; i++){
        if(x % i == 0)   return false;
    }
    return true;
}
void dfs(int len, int now){
    if(len == n){
        v.push_back(now);
        return;
    }

    for(int i = 0; i <= 9; i++){
        if(isprime(now * 10 + i))   dfs(len + 1, now * 10 + i);
    }
}
int main()
{
    freopen("sprime.in","r",stdin);
    #ifndef poi
    freopen("sprime.out","w",stdout);
    #endif
    cin >> n;
    for(int i = 2; i <= 9; i++){
        if(isprime(i)) dfs(1, i);
    }
    for(int i = 0; i < v.size(); i++){
        printf("%d\n", v[i]);
    }
    return 0;
}

至此 水题章节完成。。

我的火车票还没买到= =

时间: 2024-10-27 05:52:28

Section 1.5 也许这才是暴力搜索的相关文章

[暴力搜索] POJ 3087 Shuffle&#39;m Up

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10003   Accepted: 4631 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks o

HDU 3699 A hard Aoshu Problem (暴力搜索)

题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(相同的字符串进行相同的数字替换), 替换后的三个数进行四则运算要满足左边等于右边,求有几种解法. Sample Input 2 A A A BCD BCD B Sample Output 5 72 eg:ABBDE   ABCCC   BDBDE :令 A = 1, B = 2, C = 0, D = 4, E = 5 12245 + 12000 = 24245: 注意没有前导零!! #include<stdio.h>

HDU 4499 Cannon (暴力搜索)

题意:在n*m的方格里有t个棋子,问最多能放多少个炮且每个炮不能互相攻击(炮吃炮) 炮吃炮:在同一行或同一列且中间有一颗棋子. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <math.h> #define M 50 #define LL long long using

poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)

题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一个边界外,跳到了另一边的边界外,每跳一次对那个点进行标记. 现在给你很多青蛙跳过后的所标记的所有点,那请你从这些点里面找出 一条可能的路径里面出现过的标记点最多. 分析:先排序(目的是方便剪枝,break),然后枚举两个点,这两个 点代表这条路径的起始的两个点.然后是三个剪枝,下面有. 开始遍历时,

hdu 1399 Starship Hakodate-maru (暴力搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1399 题目大意:找到满足i*i*i+j*(j+1)*(j+2)/6形式且小于等于n的最大值. 1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n),n) 10 { 11 int j,

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include

Codeforces Round #224 (Div. 2) D 暴力搜索加记忆化

题意读了半年,英语太渣,题意是摆两个棋子在棋盘上作为起点,但是起点不能在#上,然后按照图的指示开始走, < 左 > 右 ^上 v下,走的时候只能按照图的指示走,如果前方是 #的话,可以走进去,但是 走进去之后便不能再走了,走的途中两个棋子不能相碰,但是最终都走到同一个#里是没事的,并且若是能走 无限步的话 输出 -1, 例如  > < 这样左右左右的走就能无限走,然后问你 两个棋子走的最大步数的和 一开始被输出-1给困住了,因为除了 .> <这样以外  还可以刚好形成一

POJ 2329 (暴力+搜索bfs)

Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 Description Input is the matrix A of N by N non-negative integers. A distance between two elements Aij and Apq is defined as |i ? p| + |j ? q|. Your pro

POJ 2110 Mountain Walking 暴力搜索+二分

题意:n*n的矩阵 每次能走四个方向,定义路径的花费为:路径中方格的max-min,问从左上到右下的最小花费,n<=100 4个方向不是DAG,不能DP,暴力搜索 每个点最坏情况下走n*n 共n*n个点 O(n^4)TLE二分ans后 枚举下界,则此时知道路径的最小值和最大值从 起点出发把mn<=c<=mx的点都遍历,此时dfs 相当于遍历图,不用回溯,复杂度为O(n^3*logn) #include <iostream> #include <cstring> #