09 2013 档案
摘要:http://poj.org/problem?id=1159题意:给定一个字符,问最少插入多少字符,使该字符串变成回文字符串。思路:设原字符串序列为X,其逆字符串为Y,则最少插入的字符数=length(X)-X与Y的最长公共子序列的长度。求LCS的状态转移方程为 max(dp[i-1][j],dp[i][j-1]) s1[i-1]!=s2[j-1] dp[i][j] = dp[i-1][j-1]+1; s1[i-1]==s2[j-1];由于数据范围大,本题使用的滚动数组。 1 #include 2 #...
阅读全文
摘要:http://poj.org/problem?id=1837 1 #include 2 #include 3 const int N=15002; 4 int dp[21][N]; 5 int main() 6 { 7 int n,num; 8 int dis[21],w[21]; 9 memset(dp,0,sizeof(dp));10 scanf("%d%d",&n,&num);// n钩子数,num砝码数11 for (int i = 1; i <= n; i ++)12 scanf("%d",&dis[i]);13
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4712题意:计算任意两个十六进制的数异或后1的最少个数。思路:用随机数随机产生两个数作为下标,记录这两个数异或后1的个数,输出1的个数最少是多少。 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 const int N=100002; 8 const int INF=1<<29; 9 int f[N];10 int main()11 {12 int t;13 scanf("%d",&a
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4715题意:给一个偶数,将这个偶数用两个最小的素数表示,如果不能表示则输出FALL; 注意给定的偶数可能为负值。思路:素数打表,将给定的数从第一个素数开始相加,判断相加后的值是否为素数。 1 #include 2 #include 3 4 const int N=1000050; 5 int f[N],p[N/2]; 6 int num;//1e6内素数个数 7 8 void is_prime() 9 {10 f[1] = 0;11 f[2] = 1;12 for (int i...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4707题意:判断距离大于D的点有多少个。思路: 邻接表建图,dfs每一个点,记录步数。 1 #include 2 #include 3 const int N=200002; 4 int vis[N],dis[N],head[N],cnt,step; 5 struct node 6 { 7 int u; 8 int v; 9 int next;10 } edge[N];11 void add(int u,int v)12 {13 edge[cnt].u = u;14 ...
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1272思路:所求的图满足两点要求:(1) 连通 (2) 不存在环 。而这两点用并查集都能判断。注意本题中 输入 0 0时,应输出 Yes。 1 #include 2 #include 3 const int N=100002; 4 int f[N],vis[N]; 5 void init() 6 { 7 for (int i = 1; i <= N; i ++) 8 { 9 f[i] = i;10 vis[i] = 0;11 }12 13 }14 i...
阅读全文
摘要:最短路http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2622 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const long long INF=1LLG[102];16 void init()17 {18 memset(vis,0,sizeof(vis));19 for (int i = 0;i q;31 q.push(uu);32 vis[uu] = 1;33 ...
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2566 1 #include 2 #include 3 char map[120][120]; 4 int v[120][120];//用来标记某点所能到达的所有路径 5 int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; 6 int n,m; 7 void dfs(int x,int y,int t) 8 { 9 v[x][y] = t;10 for (int i = 0; i = 0 &&
阅读全文
摘要:http://poj.org/problem?id=1703题意:有两个黑帮团伙,共n名团伙成员(不知道属于这两个黑帮中的哪一个)。现在警察有一些信息,每条信息包含2个人的编号,如果给出A a b,则输出a b的关系,即是否属于同一个黑帮;如果给出D a b,则说明a b属于不同的黑帮。思路:典型的并查集,只要两者的关系确定了,就将他们放入同一个集合内,而另外增加一个表示关系的数组link[]来表示该节点与其父亲的关系,0表示同一类,1表示不同团伙。初始时集合只有自己一个元素,link[] 初始为0。第一次用c++的输入输出,TLE了。。改成C的就A了。TLE 代码: 1 #include .
阅读全文

浙公网安备 33010602011771号