|
|
|
|
|
摘要:
完全背包问题,今天才知道0、1背包就是每种物品只有一个,而完全背包就是每种不限。这题又是抄的,不过我自己独立地敲了一遍。 1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 10010 4 int f[MAXN],num[MAXN],a[4]; 5 int main() 6 { 7 int T,i,j; 8 while(~scanf("%d%d%d",&a[1],&a[2],&T)) 9 {10 memset(f,0,sizeof(f));11 memset(num, 阅读全文
posted @ 2012-04-24 19:32
Siriuslzx
阅读(175)
推荐(0)
编辑
摘要:
最近不在状态,又要考试了,只好水一题。不过这绝不仅仅是个水题,这是我第一次参加比赛时不会做的一题,现在做了出来,感觉挺好的。 1 #include<stdio.h> 2 #include<string.h> 3 int s[105][105],vis[105][105]; 4 int n,m,tmax; 5 void dfs(int i,int j) 6 { 7 if(s[i][j] && !vis[i][j]) 8 { 9 vis[i][j] = 1;10 dfs(i-1,j);dfs(i,j-1);11 dfs(i+1,j);... 阅读全文
posted @ 2012-04-23 11:07
Siriuslzx
阅读(158)
推荐(0)
编辑
摘要:
最长子序列问题,需要打印路径。作为一个菜鸟,我竟然非要“自创”一种方法,结果是惨痛的。最后还是参考前辈的代码,用一个二维数组记录指向,0表示斜移,1、-1是左移或上移。本来按我的原则抄的代码是不应该贴出来的,但这次我无耻地改了一下再贴,方便以后自己看。 1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 110 4 #define MAXM 40 5 char a[MAXN][MAXM], A, b[MAXN][MAXM], B; 6 int f[MAXN][MAXN], p[MAXN][MAXN], flag 阅读全文
posted @ 2012-04-21 15:05
Siriuslzx
阅读(216)
推荐(0)
编辑
摘要:
经典的0、1背包(话说现在还不知道什么是0、1背包),还用上了滚动数组。当初最先接触背包问题时,纠结到死,现在做起来流畅多了,只能说人是会进步的啊! 1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 1005 4 int p[MAXN],w[MAXN],f[32]; 5 int main() 6 { 7 int T,N,G,i,j,t,ans; 8 scanf("%d",&T); 9 while(T--)10 {11 scanf("%d",&N);12 阅读全文
posted @ 2012-04-20 16:42
Siriuslzx
阅读(201)
推荐(0)
编辑
摘要:
最近的任务是最短路,白书上的内容勉强能懂,一到做题就完了蛋了。这毕竟是具体的算法,不像DP只是思想,没有基础真的不行,于是学长让我先做并查集,再看树,再学图论……说到并查集,有篇很经典的文章http://apps.hi.baidu.com/share/detail/15881874,要是讲算法的文章都是这种风格,那世界就太美好了。代码如下: 1 #include<stdio.h> 2 int boss[10000010]; 3 int n,m; 4 int find(int a) 5 { 6 int i,j,r; 7 r = i = a; 8 while(boss[r]... 阅读全文
posted @ 2012-04-18 10:21
Siriuslzx
阅读(196)
推荐(0)
编辑
摘要:
不得不表示,能用栈来做的题目前对我来说都很费解,这题又是抄的,来自校友JMDWQ,只不过把C改成了C++。开始时我用的是暴搜,数组的每一位就是一个“魂器”,而他的栈结构里每一位是连续相同的“魂器”的长度,明显要好的多。对他的核心代码,我的理解是这样的,大牛勿喷:判断当前与前一位 相同:栈顶++;(当前连续区长度+1) 不同:不能变化 || top==0: s[++top] = 1;(开辟新区,长度为1) 能变化 && top(存在区):只有一个区:栈顶++(长度+1);t = !t(最左边的区变了); ... 阅读全文
posted @ 2012-04-14 10:23
Siriuslzx
阅读(197)
推荐(0)
编辑
摘要:
其实同种类型的题我不想重复发的,感觉没意思。这题又是硬币问题,和147、674原理一样。只是我在做这题时遇到了新的问题,也算是有新的收获,就发一下吧。我曾和zxpn讨论过是之前就算好所有结果,还是每输入一个就计算一个效率高。当时我认为肯定是输一个算一个好,因为把所有的都算出来,并不是每个都会用的,也算一种浪费;而DP时用记忆化搜索会保存每次调用的所有数,如果下次也要调用的话就不必再算了,明显更好。今天遇到这题DP不行了,原因是数很大时用递归形式的DP会导致栈溢出。下面是代码: 1 #include<stdio.h> 2 typedef long long int llg; 3 #d 阅读全文
posted @ 2012-04-08 20:00
Siriuslzx
阅读(182)
推荐(0)
编辑
摘要:
这题和UVA 674差不多,都是硬币问题。上次我是抄的,结果还没看懂,这次终于自己写了!本来我已经想好了一种递推,用d[i][j]表示面值为 i 时必须用coin[j]且最大硬币为coin[j]时的总数,那么d[i][j] = d[i-coin[j]][0] + d[i-coin[j]][1] +……+d[i-coin[j]][j],最终结果为d[i][0] + d[i][1] +……+d[i][10],还是要有一个相加的过程,感觉不够利索,只好再重新构造递推关系,令f[i][j]表示面值为 i 时最大硬币为coin[j]时的总数,则f[i][j] = d[i][0] + d[i][1] .. 阅读全文
posted @ 2012-04-06 23:30
Siriuslzx
阅读(390)
推荐(0)
编辑
摘要:
简单题,求最长公共序列。 1 #include<stdio.h> 2 #include<string.h> 3 int a[105],b[105],d[105][105]; 4 int max(int a,int b) 5 {return a>b ?a :b;} 6 int main() 7 { 8 int m,n,i,j,num=0; 9 while(scanf("%d %d",&m,&n)==2)10 {11 if(!m && !n) break;12 num++;13 for(i = 0; i < m 阅读全文
posted @ 2012-04-04 10:58
Siriuslzx
阅读(197)
推荐(0)
编辑
摘要:
这题和hdu1160一样。因为刚学了nlogn,所以这题也想用它,结果杯具了。因为我总是想不出weight相同时该怎么处理,以及怎么输出。在nlogn的框架下我想了N小时,最后决定换思路。后来用的是用数组记录长度与距离,结果又因为一个很小的细节又搞了一个多小时,简直就是“餐具”啊!这个细节是 if(** > **) f[i] = f[j] + 1; 少了一个 && …… 1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std 阅读全文
posted @ 2012-04-03 16:27
Siriuslzx
阅读(272)
推荐(0)
编辑
|
|