2011年9月30日
摘要: http://poj.org/problem?id=1042此题没有AC成功,因为每个湖的时间输出有一定的顺序要求,目前还不知道怎么处理。。。#include<iostream>using namespace std;struct Lake{ int id; int time; int num; int decr; bool operator > (const Lake &a)const{ return num > a.num; } void operator =( Lake &a){ id=a.id; tim... 阅读全文
posted @ 2011-09-30 20:21 geeker 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公式计算基本就无望了。另外一个难点就是效率。 对于第一个数据溢出的问题,可以这样解决。因为组合数公式为: C(n,m) = n!/(m!(n-m)!)为了避免直接计算n的阶乘,对公式两边取对数,于是得到: ln(C(n,m)) = ln(n!)-ln(m!)-ln((n-m)!)进一步化简得到: 这样我们就把连乘转换为了连加,因为ln(n)总是很小的,所以上式很难出现数据溢出。 为了解决第二个效率的问题,我们对上式再做一步化简。上式已经把连乘法变成了. 阅读全文
posted @ 2011-09-30 13:15 geeker 阅读(3659) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problemstatus?problem_id=1159这个题目即给定一个字符串,让你计算至少插入几个字母,就可将原字符串改为回文序列。设该字符串一共有n个字母,为str[1:n]状态dp[i][j]定义为:对于子串str[i:j]构成回文数需要插入字母数量的最小值。那么可知当头尾字母相同时,即str[i]=str[j]时,dp[i][j]=dp[i+1][j-1]如果头尾字母不想同时,那么可以在头部加一个和末尾一样的字母构成回文序列dp[i][j]=dp[i+1][j]+1 也可以在尾部加一个和头部一样的字母构成回文序列dp[i][j]=dp[i][j-1]+ 阅读全文
posted @ 2011-09-30 02:37 geeker 阅读(655) 评论(0) 推荐(0) 编辑