摘要: http://poj.org/problem?id=1080知识点 :最长公共子序列要点:转移方程 f[i][j] = max{ f[i-i][j]+score[s1[i-1]]['-'], f[i][j-1]+score['-'][s2[j-1]], f[i-1][j-1]+score[s1[i-1]][s2[j-1]]}#include using namespace std;int score['T'+1]['T'+1];int dp[1000][1000];char s1[200],s2[200];void init(){ 阅读全文
posted @ 2013-08-04 14:35 夜晓楼 阅读(241) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1703rank 用于记录祖先的等级opp 用于记录敌人。。 1 #include 2 #include 3 using namespace std; 4 int f[100005]; 5 int rank[100005],opp[100005]; 6 char str[3]; 7 void init(int n){ 8 for(int i=1;irank[fb])26 f[fb] = fa;27 else{28 f[fa] = f[fb];29 if(rank[fa]==ra... 阅读全文
posted @ 2013-08-04 14:16 夜晓楼 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 要点:哈夫曼编码 求最后编码完成之后编码的长度解决方法: 即为所有度为2的节点的权重的和。。避免了一次次的相加 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int main(){ 9 char str[1000];10 while(cin>>str){11 if(!strcmp(str,"END"))12 break;13 int num[27];14 memset(n... 阅读全文
posted @ 2013-08-04 14:00 夜晓楼 阅读(277) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1384完全背包 要点: 要求的是最小为多少,,所以需要将f[] 初始化为最大。其他的于完全背包一样可以 1 #include 2 #define maxn 5000000 3 using namespace std; 4 int fa[10005]; 5 int w[10005],v[10005]; 6 int main() 7 { 8 int t; 9 cin>>t;10 while(t--){11 int e,f;12 cin>>e>>f;13 int ww = ... 阅读全文
posted @ 2013-08-04 11:46 夜晓楼 阅读(224) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1276解题要点:用完全背包来模拟的解题,只不过加了限制条件used[]。。。其他的就一样了。。注意: cash 和n 为0 的情况 1 #include 2 #include 3 using namespace std; 4 int cash,n; 5 int amount[20],w[20]; 6 int f[100006]; 7 int used[100006]; 8 int maxm(){ 9 if(cash==0||n==0){10 return 0;11 }12 for(int i=1;i... 阅读全文
posted @ 2013-08-04 11:38 夜晓楼 阅读(240) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2356方法一: 鸽巢原理解题思路: n个数,,依次求其s[0],s[1],s[2],s[3]。。。。。s[n] 然后对 n取模,,必然会得到n+1个结果,,这n+1个结果放到0---n-1,这n个盒子中,必然会有重复的,所以这两个重复的之间,必然就是所求的结果。 1 #include 2 #include 3 using namespace std; 4 int n; 5 int sum [10002]; 6 int s[10002]; 7 int select[10002]; 8 int main() 9 {10 cin>>n 阅读全文
posted @ 2013-08-04 11:29 夜晓楼 阅读(223) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1664解题思路:f(m,n) m个苹果放到n个盘子里1、当只有一个苹果或只有一个盘子时只有1中放法2、当盘子数大于苹果数时,最多为将m个苹果,在m的盘子中每个放一个 ,,即f(m,m)3、当苹果数大于等于盘子数时:(两种情况) 1、不允许有空闲时,即每个盘子中至少有一个。。为f(m-n,n); 2、允许有空闲时,即至少有一个盘子是空闲的。。即f(m,n-1); 1 #include 2 using namespace std; 3 int f(int m,int n){ 4 if(m==1||n==1||m==0)//m... 阅读全文
posted @ 2013-08-04 11:16 夜晓楼 阅读(238) 评论(0) 推荐(0) 编辑