|
|
|
|
|
04 2012 档案
poj 2823 - Sliding Window
摘要:这题是典型的单调队列,百度一下,堆、线段树、树状数组、稀疏表……我通通不会。只好抄了一个纯粹的用数组模拟的算法,脑细胞阵亡无数,才算理解了。 1 #include<stdio.h> 2 #define maxn 1000001 3 int min_1[maxn],max_1[maxn],a[maxn],n,k; 4 void get_max() 5 { 6 int i,start=1,end=1; 7 for(i=1;i<k;i++) 8 { 9 while(a[max_1[end]]<a[i]&&end>=start)10 en...
阅读全文
UVA 10285 - Longest Run on a Snowboard
摘要:不知道过了多少天了,才做了一题,还是抄的,感觉我好失败啊!苦逼的菜鸟,还有很长的路要走……不过我要严肃声明,凡是我贴出来的代码,都是我完全理解、能够自己独立敲出来的,并不是为了应付。 1 #include<stdio.h> 2 #include<string.h> 3 int r,c,f[105][105],a[105][105]; 4 int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0}; 5 int dfs(int x,int y) 6 { 7 int nx,ny,t,&ans = f[x][y]; 8 if(f[x][y] !=
阅读全文
UVA 10465 - Homer Simpson
摘要:完全背包问题,今天才知道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,
阅读全文
csu 1196 - 去爬山
摘要:最近不在状态,又要考试了,只好水一题。不过这绝不仅仅是个水题,这是我第一次参加比赛时不会做的一题,现在做了出来,感觉挺好的。 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);...
阅读全文
UVA 531 - Compromise
摘要:最长子序列问题,需要打印路径。作为一个菜鸟,我竟然非要“自创”一种方法,结果是惨痛的。最后还是参考前辈的代码,用一个二维数组记录指向,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
阅读全文
UVA 10130 - SuperSale
摘要:经典的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
阅读全文
csu 1092 - 大尾巴狼
摘要:最近的任务是最短路,白书上的内容勉强能懂,一到做题就完了蛋了。这毕竟是具体的算法,不像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]...
阅读全文
csu 1008 - Horcrux
摘要:不得不表示,能用栈来做的题目前对我来说都很费解,这题又是抄的,来自校友JMDWQ,只不过把C改成了C++。开始时我用的是暴搜,数组的每一位就是一个“魂器”,而他的栈结构里每一位是连续相同的“魂器”的长度,明显要好的多。对他的核心代码,我的理解是这样的,大牛勿喷:判断当前与前一位 相同:栈顶++;(当前连续区长度+1) 不同:不能变化 || top==0: s[++top] = 1;(开辟新区,长度为1) 能变化 && top(存在区):只有一个区:栈顶++(长度+1);t = !t(最左边的区变了); ...
阅读全文
UVA 357 - Let Me Count The Ways
摘要:其实同种类型的题我不想重复发的,感觉没意思。这题又是硬币问题,和147、674原理一样。只是我在做这题时遇到了新的问题,也算是有新的收获,就发一下吧。我曾和zxpn讨论过是之前就算好所有结果,还是每输入一个就计算一个效率高。当时我认为肯定是输一个算一个好,因为把所有的都算出来,并不是每个都会用的,也算一种浪费;而DP时用记忆化搜索会保存每次调用的所有数,如果下次也要调用的话就不必再算了,明显更好。今天遇到这题DP不行了,原因是数很大时用递归形式的DP会导致栈溢出。下面是代码: 1 #include<stdio.h> 2 typedef long long int llg; 3 #d
阅读全文
UVA 147 - Dollars
摘要:这题和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] ..
阅读全文
UVa 10066 - Twin Tower
摘要:简单题,求最长公共序列。 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
阅读全文
UVA 10131 - Is Bigger Smarter?
摘要:这题和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
阅读全文
UVA 116 Unidirectional TSP
摘要:这题没什么难度,按列从后往前递推就行了。刚开始老是WA,原来是没注意到“lexicographically smallest ”,英文不好的童鞋桑不起啊!这个按最小字典序输出还真是头疼,我用的是记录路径,而不是递归打印,只好略加改动了。 1 #include<stdio.h> 2 int m,n,route[12][105],f[12][105]; 3 int main() 4 { 5 int i,j,t,min,flag; 6 while(scanf("%d%d",&m,&n)==2) 7 { 8 for(i = 0; i < m; i+
阅读全文
poj 3620 Avoid The Lakes
摘要:斌哥说这题不是DP题,可我真的用DP做的啊,难道我已经突破了类型的限制?哈哈。这题我用了DFS加DP。 1 #include<stdio.h> 2 #include<string.h> 3 int m,n,k,f[105][105],vis[105][105]; 4 int dp(int i,int j) 5 { 6 if(!f[i][j] || vis[i][j]) return 0; 7 vis[i][j] = 1; 8 int &ans = f[i][j]; 9 ans += dp(i-1,j)+dp(i+1,j)+dp(i,j-1)+dp(i,j+1);
阅读全文
poj 3230 Travel
摘要:一道看起来比较纠结的题,但思路很好想:一天一天的递推。看开始没看到“The traveler always starts from city 1”,害得我想复杂了,差点儿把O(n^3)写成O(n^4)。 1 #include<stdio.h> 2 int m,n,f[105][105],cost[105][105]; 3 int main() 4 { 5 int i,j,k,max; 6 while(scanf("%d%d",&n,&m)==2) 7 { 8 if(!m && !n) break; 9 for(i = 1; i &
阅读全文
hdu 1950 Bridging signals
摘要:还是求最长上升子序列,DP中基础的一种。不过今天出了点问题,TLE了。经过提醒,我花了N个小时去看nlogn算法,总算A了。作为一个菜鸟,还真是没有骄傲的资本啊。 1 #include<stdio.h> 2 #define MAXN 40005 3 int m,n; 4 int c[MAXN],a[MAXN]; 5 int find(int *c,int len,int n) 6 { 7 //就是在n可以取代数组c中的数的条件下, 8 //把n放到c中,n所对应的下标 9 int left=0,right=len,mid;10 mid = (left+right)/2;...
阅读全文
UVA 10003 Cutting Sticks
摘要:今天好不容易A了一题,还是“借鉴”的。原文在http://blog.csdn.net/biran007/article/details/3865350。不管怎么,还是有收获的。比如我才知道原来递推数组是能大幅度缩减的,真是有种醍醐灌顶的感觉。另外,今天我已经INF次把dp(x,y)写成dp[x][y]了,真是丢人。
阅读全文
|
|