您的位置:首页 > 其它

USACO2.3基础的算法题

2016-03-17 22:19 375 查看

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加油啊少年,长路漫漫,且行切坚定.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法