Section 2.3 蔓延感

Longest Prefix

给定一堆小字符串,问最长可以组成给定的大字符串的多少位前缀。

类似于DP的思想,标记出结束位置。看最远结束在哪里。

#include <bits/stdc++.h>
using namespace std;
const int N  = 1205;
const int M  = 200004;
string ch[N];
char st[100];
bool ok[M];
int main()
{
    string str = "";
    string s;
    freopen("prefix.in","r",stdin);
    #ifndef poi
    freopen("prefix.out","w",stdout);
    #endif
    int id = 1;
    int i, j, k;
    cin >> st ;

    while(st[0] != ‘.‘) {
        ch[id] = (string)st;
       // cout << ch[id] << endl;
        id++;
        cin >> st;
    }
    id --;
    while(cin>>s) str += s;
    int len = str.length();
    ok[0] = true;
    int ans;
    for(i = 0;  i <= len; i++){
        if(!ok[i])continue;
        ans = i;
        for(j = 1; j <= id; j++){
            for(k = 0; ch[j][k] != ‘\0‘&&j+k<=len; k++)   {
                if(str[i+k] != ch[j][k])  break;
            }
            if(ch[j][k]!=‘\0‘)  continue;
            ok[i+k] = true;
        }
    }
    cout <<ans<<endl;
    return 0;
}

Cow Pedigrees

每头牛要么不生,要么生两只。最多200只,问正好升到K代的族谱的可能性。

DP。

状态:DP[I][J]表示用I头牛最多到J代的族谱的可行方案数。

转移:DP[I][J]=ΣDP[K][J-1]*DP[I-K-1][J-1] (1<=K<=I-2)

  解释:可以视为再放一头牛当现有的祖先,则一边是左(K) 一边是右儿子(I-K-1)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 204;
 4
 5 const int MOD = 9901;
 6 int dp[N][N];
 7 int main()
 8 {
 9     freopen("nocows.in","r",stdin);
10     #ifndef poi
11     freopen("nocows.out","w",stdout);
12     #endif
13     int n, m, i, j, k;
14     cin >> n >> m;
15     for(i = 1; i <= m; i++)dp[1][i] = 1;
16     for(i = 2; i <= n; i++){
17         for(j = 1; j <= m; j++){
18             for(k = 1; k <= i - 2; k++){
19                 dp[i][j] =((dp[k][j-1]*dp[i-k-1][j-1])%MOD+dp[i][j])%MOD;
20             }
21         }
22     }
23     int ans = ((dp[n][m] - dp[n][m-1])%MOD+MOD)%MOD;
24     cout << ans<<endl;
25     return 0;
26 }

Zero Sum

1 2 3 4 5 。。。N 这样,可以在两个之间插+ - 和空格 ,问有多少种插法可以使得最后结果是0

DFS暴力搜索。

#include <bits/stdc++.h>
using namespace std;
char ans[50];

int n;
void dfs(int nowsum, int nowdig, int presum){

    //system("pause");
    if(nowdig == n){ //cout << nowsum << " "<<nowdig <<" " << presum<<endl;
        if(nowsum + presum== 0) {

            cout << ans << endl;
        }
        return;
    }
    ans[nowdig*2-1] = ‘ ‘;
    ans[nowdig<<1] = nowdig + 1 + ‘0‘;

    dfs(nowsum, nowdig + 1, presum*10+(nowdig + 1)*(presum<0?-1:1));

    ans[nowdig*2-1] = ‘+‘;
    ans[nowdig<<1] = nowdig + 1 + ‘0‘;
//    if(nowdig == 6){
//        cout << nowsum+presum<<" " <<nowdig+1<<" "<<  nowdig + 1<<endl;
//    }
    dfs(nowsum+presum, nowdig + 1, nowdig + 1);

    ans[nowdig*2-1] = ‘-‘;
    ans[nowdig<<1] = nowdig + 1 + ‘0‘;
    dfs(nowsum+presum, nowdig + 1, -nowdig -1);

}
int main()
{
    freopen("zerosum.in","r",stdin);
    #ifndef poi
    freopen("zerosum.out","w",stdout);
    #endif
    ans[0] = ‘1‘;

    cin >> n;
    ans[(n<<1)-1] = ‘\0‘;
    dfs(0, 1, 1);
       return 0;
}

Money Systems

裸背包

#include <bits/stdc++.h>
using namespace std;
const int N = 30;
const int M = 10004;
typedef long long ll;

ll dp[M];
int val[N];
int main()
{
    freopen("money.in","r",stdin);
    #ifndef poi
    freopen("money.out","w",stdout);
    #endif
    int n, m, i, j;
    dp[0]= 1;
    cin >> n >> m;
    for(i = 1 ;i <= n; i++)cin >> val[i];

    for(i = 1; i <= n; i++){
        for(j = val[i]; j <= m; j++){
            dp[j]+= dp[j-val[i]];
        }
    }
    cout << dp[m]<< endl;

}

Controlling Companies

http://www.wzoi.org/usaco/13%5C309.asp 题意偷懒。。

我们可以感觉应该是一层一层往上推出来的。

所以可以用队列这样的感觉,每次发现了一个新的控制信息,就放进队列,待会儿更新控股信息。

#include <bits/stdc++.h>
using namespace std;
const int N = 104;

bool con[N][N];
int have[N][N];
struct point{
    int a, b;
    point(){};
    point(int _a, int _b){a = _a, b = _b;};
};
int main()
{
    freopen("concom.in","r",stdin);
    #ifndef poi
    freopen("concom.out","w",stdout);
    #endif
    queue<struct point>q;
    int n, a, b, c, m = 0, i, j;
    scanf("%d", &n);
    for(i = 1; i <= n; i++){
        scanf("%d%d%d", &a, &b, &c);
        m = max( m, b);        m = max(m, a);
       // cout << c <<endl;
        if(c>=50){
            con[a][b] = true;
            q.push(point(a, b));

        }
        have[a][b]+= c;
    }
  //  cout <<have[2][3]<<endl;
    point x;
    while(!q.empty()){
        x = q.front();
        a= x.a; b = x.b;
      //  cout << a << " "<< b << endl;
        q.pop();
        for(i = 1; i <= m; i++){
           // if(!con[b][i] ) continue;

            if(have[a][i] >= 50)    continue;
            have[a][i] += have[b][i];
        //    cout << a << "!" << i << " " << have[a][i] <<" " << have[b][i]<<endl;
            if(have[a][i] >= 50){
                con[a][i] = true;
                q.push(point(a, i));
            }
        }
    }
    for(i = 1; i <= m; i++){
        for(j = 1; j <= m; j++){
            if(i == j || !con[i][j])continue;
            printf("%d %d\n", i, j);
        }
    }
    return 0;
}

时间: 2024-10-09 17:12:17

Section 2.3 蔓延感的相关文章

HTML5 中 div section article 的区别

刚刚开始接触 HTML5 时,对它的标签很不适应,甚至一度有点反感.尤其是对 div.section.article 这几个标签,实在弄不清楚应该使用在什么场合下. div HTML Spec: The div element has no special meaning at all. 这个标签是我们见得最多.用得最多的一个标签.本身没有任何语义,用作布局以及样式化或脚本的钩子(hook). section HTML Spec: “The section element represents

软件项目如何控制需求蔓延

当销售人员兴冲冲的告诉你又接了一个单子,只见合同上对需求内容只是寥寥几行时,你是否又头大了.对于销售人员接单是他们的目的,在客户处他们往往把话说的很满,这也能行.哪也能做.实际,很多功能的实现要让我们付出非常大的代价,那我们在项目需求管理方面要怎么做呢? 对于一名项目经理来说,做出让客户满意的产品是我们的终极目标.但实际情况会是这样吗?现实,我们在项目开发过程中会遇到各种问题. 需求范围不明确 合同中规定的内容往往都是模糊不清的,需求不明确,或者只有几行说明,而且还可能有大断的套话.官话.对于项

attribute section的用法

1. gcc的__attribute__编译属性 要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性,__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性.比如对函数,noline将禁止进行内联扩展.noreturn表示没有返回值.pure表明函数除 返回值外,不会通过其它(如全局变量.指针)对函数外部产生任何影响.但这里我们比较感兴趣的是对代码段起作用子项section. __attri

USACO Training Section 3.1 Contact

P2724 联系 Contact 题目背景 奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣.最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来.他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的 题目描述 帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相.他们在寻找长度在A到B之间(包含A和B本身)在每天的数据文件中重复得最多的比特序列 (1 <= A <= B <= 12).他们在找那些重复得最多的比特序列.一个输入限制告诉你应输出

【opencv入门之二】感兴趣区域ROI,线性混合addWeighted

参考网站: http://blog.csdn.net/poem_qianmo/article/details/20911629 1.感兴趣区域ROI //[2]定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows )); //[3]加载掩摸(必须是灰度图) Mat mask = imread( "dota_logo.jpg", 0 ); //[4]将掩摸拷贝

iOSCollectioView滚动到指定section的方法

CollectioView滚动到指定section的方法 项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行,滚动collectionView自动切换到顶部指定的标签 实现方法如下: 1. 保证collectionView全部加载完毕,我这里通过一个bool的标志位来标示 -(void)collectionView:(UICollectionView *)collectionView willDisplayC

获得他人体感

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 36.0px "PingFang SC"; min-height: 50.0px } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 36.0px "PingFang SC" } span.Apple-tab-span { white-space: pre } 3个人如何获得与他人相同的体感 人与人之间的体感是不一样的,造成的思想也

HttpWebRequest出错 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF

服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 主体意思是微软没有容忍不符合RFC 822中的httpHeader必须以CRLF结束的规定的服务器响应. 一个解决方案是在application.config或web.config文件里加入 <

HDU 3296 &amp; POJ 3138 Acm Team Section(数学)

题目链接: HDU: http://acm.hdu.edu.cn/showproblem.php?pid=3296 POJ:  http://poj.org/problem?id=3138 Acm Team Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 159    Accepted Submission(s): 47