摘要: 这是一道非常基本的最短路问题,使用floyd算法。这是我第一次写floyd,对算法还不甚了解,第一次写的时候将本应该是k,i,j的循环写成了i,j,k,于是WA了一会儿,后来对照别人的代码发现了这个问题,但是我还没明白为什么是k,i,j。这一点一定要在最近弄清楚,否则就成了背算法而不是学算法,我应该它理解才行。#include<stdio.h>#include<string.h>#define max_vertx 200#define infnty 1000000000int data[max_vertx][max_vertx];int main(){ int n; w 阅读全文
posted @ 2012-05-05 23:11 等待电子的砹 阅读(373) 评论(0) 推荐(0)
摘要: 一道最小生成树的问题。 题目所给的输入是按矩阵的方式输入的,显然这个矩阵关于主对角元对称,所以只需要存储一半的数据即可(其实少于一半,主对角元也不用存储)。对于输入所给的已修好路的两个村子,合并它们分别所在的集合(开始的时候思维有漏洞,直接parnt[h]=l,这样是不对的,应该先找到它们的根进行合并,看来自己思维的严密性还是很欠缺)。剩下的直接按照Kruskal算法的思路进行即可,遇到不在同一连通集合的村子,说明两个村子之间需要修路。#include<stdio.h>#include<stdlib.h>#define max_town 110#define max_r 阅读全文
posted @ 2012-04-19 00:39 等待电子的砹 阅读(539) 评论(0) 推荐(0)
摘要: 一道简单的动态规划。 这道题要求的是最长上升子序列的和。用一个sum数组存储子问题的解。(sum对应的下标 i 表示,从0到i,最长上升子序列的和。)从头开始,遍历每一个数,开始第一重循环。对每一个数,又从头遍历到这个数的前一个数,这是第二重循环,在第二重循环中,用下标j表示当前遍历到的数,如果data[i]>data[j],则说明data[j]和data[i]能构成一个上升子序列,但此时还需继续往后遍历(因为要求最长),用tem保存最大的sum[j](到第j个数时的解,最大的sum[j]才能保证最长子序列)。遍历完后,将此时的sum[i]更新(sum[i]+=data[i]+tem), 阅读全文
posted @ 2012-04-07 18:56 等待电子的砹 阅读(1654) 评论(0) 推荐(0)
摘要: 这是一道简单的动态规划入门题目。 这道题与经典动态规划题目数塔非常相似。 在写这道题的时候思路不太清晰:当时我按时间递增顺序遍历每一秒,忘记了加上的是上一秒合法情况的最大值(写的时候居然想成了加上data[i-1][j-1]、data[i-1][j]和data[i-1][j+1]),所以在空行的处理上纠结了很长的时间。最后才突然发现了自己犯下的这个低级错误。 另外,由于第一秒处在 x=5 的位置,所以在前4秒(也可以说是前5秒)的所有合法位置构成的是三角形,这一点需要注意。 我最后采用按时间递减的顺序遍历每一秒,所以没有理会那个三角形。 代码还需要优化。#include<stdi... 阅读全文
posted @ 2012-04-07 11:40 等待电子的砹 阅读(581) 评论(0) 推荐(0)