USACO2.3基础的算法题

26 篇文章 0 订阅

prefix

没想到是queue + vis 形式dp…..dfs一直爆栈

然后最近代码量少了所以一开始爆搜都错很多次

罪过…罪过…

c++
//interesting input way
while (fscanf (fin, "%s", data+ndata) == 1)
    ndata += strlen(data+ndata);

//DP in official solution
 for (lv = 0; lv < ndata; lv++)
    if (start[lv]) 
     { /* for each expressible prefix */
        best = lv; /* we found a longer expressible prefix! */
        for (lv2 = 0; lv2 < nump; lv2++)
        {
            for (lv3 = 0; lv + lv3 < ndata &&  prim[lv2][lv3] &&
                prim[lv2][lv3] == data[lv+lv3]; lv3++);
            if (!prim[lv2][lv3])   /* it matched! */
            start[lv + lv3] = 1; /* so the expanded prefix is also expressive */
       }
     } 

nocows

DP,和斐波那契类似,子问题太多,不DP会挂.

但是一开始思路不是很清晰变量名很烂我也不知道为什么面向过程的设计变量名漂亮很重要…所以不知道挂到哪里了.

求出每一层的最大最小值,然后遍历从最小到最大(都能取到)应该是一个系数比较小的 O(n3)

for (int nowNode=3; nowNode<=n; nowNode+=2) {
        //笔算公式
        maxheight[nowNode]=(nowNode+1)/2;
        //枚举
        int p=0;
        while (twoexp[p]<nowNode)p++;
        minheight[nowNode]=p;
        //代码美观真的很重要..
        for (int conLeft=1; conLeft<nowNode; conLeft+=2) {
            for (int h=minheight[conLeft]; h<=maxheight[conLeft]; h++) {
                int conRight=nowNode-conLeft-1;
                for (int hr=minheight[conRight]; hr<=maxheight[conRight]; hr++) {
                    int mh=max(h,hr)+1;
                    dp[nowNode][mh]=(dp[nowNode][mh]+dp[conLeft][h]*dp[conRight][hr])%mod;
                }
            }
        }
    }

zerosum

dfs枚举运算符,序号判断有些麻烦..
答案里面的字符串使用挺有意思的

char str[30];
strcpy(str, "1 2 3 4 5 6 7 8 9");
str[2*n-1] = '\0'; 

for(p=" +-"; *p; p++) {
        s[2*k+1] = *p;
        search(s, k+1);
    }

money

一开始觉得是多重背包(备注部分)…

然后套01背包的公式过的…

最后发现是自己把01和完全的记反了……

for (int i=0; i<tot; i++) {
        for (int k=0; k<=aim-num[i]; k++) {
            ways[k+num[i]]+=ways[k];
        }
//        for (int p=num[i]; p<=aim; p+=num[i]) {
//            for (int k=aim; k>=p; k--) {
//                ways[k]+=ways[k-p];
//            }
//        }
}

更惊讶的是..去查百度他说是母函数……

concom

一开始觉得暴力过不了,不想打
然后发现暴力实现起来并不是那么容易

遇见了一些美好的心情后开始打,
每一次输入刷一遍(还是暴力..)过了很开心~

就像那句话说的那样
往往会低估计算机的能力,也往往会高估自己的编程能力.

心得

这一章主要是搜索和简单的dp,但是拖的时间相对长,一方面是因为自己广撒网,干别的事去了.另一方面是有一定的畏惧心理.今天真是美好的一天,各种美丽邂逅我的心情hh加油啊少年,长路漫漫,且行切坚定.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值