03 2012 档案
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int c[10001],w[10001],f[10001]; 6 int main() 7 { 8 int i, j, n, v; 9 10 while(scanf("%d%d",&n,&v)&&n&&v)11 {12 memset(f,0,sizeof(f)); 13 for(i=0; i<n; i++)14 ...
阅读全文
摘要:网上搜的: 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最
阅读全文
摘要:看了两个多小时的01背包问题,这是做出来的第一道,Happy~!提议可以这样来理解,要求邮票的分值之差最小,就是邮票分成两堆即两个容器,而每张邮票只有选和不选两种状态,所以只要求出每个容器的最大装载量即可,这样就转化为01背包问题了。这和zb的生日那道题一样只要代码稍作休改就能过。score[j]代表的是容量为j的容器所能装载邮票的最大分值。得出递推关系式:score[j] = score[j] > score[j-a[i]]+a[i] ? score[j] : score[j-a[i]]+a[i];其中a[i]是第i个邮票的分值View Code 1 #include<stdio
阅读全文
摘要:此题是数字三角形的变形,有些细节要注意,当KK走倒最后一列是只能向下走,当KK走到最后一行时,只能向右走;这两种情况要单独考虑。d[i][j]指在i,j这个位置走到右下角所能吃的虫子数目。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 int main() 6 { 7 int i,j,N,M; 8 int a[25][25],d[25][25]; 9 10 scanf("%d%d",&N,&M);11 for(i=1;
阅读全文
摘要:题目意思很简单了,输入一个行数和列数相同的矩阵a[n][n]然后求最大的子矩阵和。它实际上就是最大子段和的二维推广,可以按照一维的思路来做。首先将每一列的和压缩成一个b[j]数组的元素,它代表a[i1][j]+a[i1+1][j]+......+a[i2][j]的和,这是保持列数不变再把它压缩成一个元素,这样进行压缩后实际上就是求b[1].....b[j]..b[n]的最大子段和,这就转化为一维的情况。View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define N 101 5 int a[N][N]; 6
阅读全文
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() 5 { 6 int i, j, ncases, n; 7 int a,b,sum; 8 scanf("%d",&ncases); 9 while( ncases-- )10 {11 b=-1, sum = -9999; //其中的值会有负数,所以b,sum要先设负值12 scanf("%d",&n); 13 for(i=1; i<=n; i++)14 ...
阅读全文
摘要:View Code 1 不要把它当做一般的水题看,尽管算法比较简单属于 2 入门的DP可是测试数据真的很坑爹!一开始写了个函 3 数将start,end,a[],设为全局变量可还是过不了,最后 4 我把函数全写在了主函数内了,全部改成局部变量,最后过了! 5 #include<stdio.h> 6 #include<stdlib.h> 7 8 int main() 9 {10 int i, ncases, n, j,sum,b,k;11 int a[100001],start,end;12 13 scanf("%d",&ncases);14
阅读全文
摘要:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define MAX 1000 5 6 int c[MAX][MAX],len1,len2; 7 char x[MAX],y[MAX]; 8 void LCSLength(int m,int n,char *x,char *y) 9 {10 int i,j;11 for(i=0; i<m; i++) 12 c[i][0] = 0; 13 for(i=0; i<n; i++)14 c[0][i] =
阅读全文
摘要:最近这几个星期一直在做搜索的题,关于搜索比刚是学的时候有了更深刻的了解,普通的对于我来说已经很好解决,不过碰到难的像是双向BFS或是关于特殊状态的存储这一类的题还是不太会做,自己对此理解的也不够深刻,还是很仰慕那些神牛级的人物啊!说说BFS吧,做题是肯定是用到队列啦,BFS类似于层次遍历是一层一层向外扩展,通常用来求最小的步数,最短距离神马的。借助于队列可将每一步扩展的数值保存在队列里,再出队列判断是否满足要求,如果满足要求就停止打印步数,如果不满足则继续遍历想外层扩展,知道找到位置才停下。最后再用while循环时不要忘了一定要清空队列,应为队列里可能保存着上次遍历留下的值;有时也会...
阅读全文
摘要:思路很简单,简单的素数环,相邻位必定是一奇一偶,当n为奇数时就不必在判断了,输出肯定木有素数环(剪枝的重要判定条件),因为n为奇数时奇数的数量一定大于偶数的数量,最后一定存在两个奇数相连(雀巢原理)。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 6 int A[20],visit[20],ok,n; 7 int isp[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0
阅读全文
摘要:题目的本质就是叫你求图中连通分支的数目。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 int dx[4] = {1,-1, 0, 0}; 6 int dy[4] = {0, 0,-1, 1}; 7 int map[101][101]; 8 int visit[101][101],num,col,row; 9 10 void DFS(int x,int y)//求出图中所有的连通分支简单DFS遍历11 {12 int i, j, x1, y1;13 if(visit[x][
阅读全文
摘要:一看到此题想都没想就用简单的回溯,可是写好代码测试样里也通过已提交就是TLE;后来请教了大神他说测试数据可能有多组单纯的输出可能会超时,好吧!我把每种情况都提前算好放在数组里接收一个我就输出一个,这样提前就把N皇后给初始化,最后输出果断AC了。 1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 int N, visit[3][30], tot, C[50]; 7 8 void dfs(int cur,int N) 9 {10 int i, j; 11 if(cur == ...
阅读全文
摘要:1 #include<stdio.h> 2 #include<math.h> 3 4 int w[25], min, ncases, total, i; 5 void dfs(int cur, int sum, int a[]) 6 { 7 int t; 8 if(cur == ncases) return ; 9 t =(int)fabs(total-sum-sum);10 if(t < min) min = t;11 dfs(cur+1, sum, a);12 dfs(cur+1, sum+a[cur], a);13 } 14 15 in...
阅读全文
摘要:此题的大致意思是在一个迷宫内,营救天使,r代表天使的朋友a代表天使,x代表卫兵;见到卫兵就打死他这要多花1各单位时间,问你要多长时间才能到达天使所处的位置。一见到此题第一反应就光搜代码很快就写完了,测试样例通过,直接提交我傻眼了,WA一直WA纠结死了!我不信邪就去搜别人代码,第一眼看到的是优先队列。我恍然大悟,我用的是普通队列只能一步步往外搜不能停顿,这是普通队列的优点也是缺点。结果我使用优先队列后只是在我代码的基础上稍作改动即实现了优先队列的功能,因为优先队列是按顺序从小到大排列时间的,所以用稍作修改果断0ms通过,真是开心啊! 1 #include<cstdio> 2 #inc
阅读全文
摘要:1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 7 using namespace std; 8 9 int dx[4] = {1,-1, 0, 0};10 int dy[4] = {0, 0, 1,-1};11 int visit[9][9];12 int map[9][9] = {{1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0,1},{1,0,0,1,1,
阅读全文
摘要:1 我的做法是先用BFS求的到达T最短的步数,再用DFS 2 做判断这样的路总共有几条和踩到地雷的路有几条, 3 DFS中用到了剪支,最后求比值即可 4 #include<cstdio> 5 #include<cstdlib> 6 #include<iostream> 7 #include<cstring> 8 #include<queue> 9 10 using namespace std; 11 12 int dx[4] = {1,-1,0, 0}; 13 int dy[4] = {0, 0,1,-1}; 14 char map[
阅读全文
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<iostream> 5 #include<queue> 6 7 using namespace std; 8 9 int dx[4] = {1, 0, -1, 0};//控制四个方向10 int dy[4] = {0, 1, 0, -1};11 int visit[65536];12 char s[4][4];13 14 typedef struct15 {16 int data;17 int s
阅读全文
摘要:1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<queue> 5 #include<cmath> 6 #include<cstring> 7 8 using namespace std; 9 10 int dx[] = {1,-1, 0, 0, 0, 0};//三维坐标,六个方向,每次只是其中一个坐标变 化,而保持另外两个不变。11 int dy[] = {0, 0, 1,-1, 0, 0};12 int dz[] = {0, 0
阅读全文

浙公网安备 33010602011771号