POJ1926Pollution(动态规划)
2013-06-06 00:52
183 查看
今天上POJ水了几道最简单的DP,却似乎没有一道是依次AC的,相当郁闷。都是因为审题不清,的注意这个问题了!!!!
首先是1157,很简单的DP从左往右有V个花瓶,上往下有F个花,吧F中花放进V个花瓶里面,下面的花必须放在上面的花的右边,每一种搭配方式有一个欣赏值,求这个值的和的最大值。
很简单,就直接用DP[i][j]表示到i,j时候的最大欣赏值
DP[i][j]=MAX(DP[i][j-1],DP[i][j]+DP[i-1][j-1]);
但我却忽略了可能都为负数的情况,所以不能全部直接memset(0);DP[i][0]=-INF这样才对!!!
View Code
最后就是这道题,坑死人!!!!!!!!!!!!!
感觉不像是DP,没有DP做,但是错了很多次,还是写一下。前面两次是OLE,不明原因。。。。。
改为不是多组输入后。就。。。。。(但我的多组输入没问题啊!!!!)
思路就是每一个顶点的度数除以这个并查集内所有度的和就是这个定点所占的比例。那就只需要并查集一下就可以了。然后就是每加一条边,这个并查集内的总和就+2,定点+1。
把总的值保留在根节点中就可以了。。num[a]是以a为根节点的次并查集总度数,ma[a]就是总和
但题目坑爹的就在于说那个值是实数而且最后的结果保留三位小数,这样又WA了两次
不管怎么说,这篇就当做是提醒自己看题吧,尤其是英文题,特别要注意!!!!!!!!!!!!!!
首先是1157,很简单的DP从左往右有V个花瓶,上往下有F个花,吧F中花放进V个花瓶里面,下面的花必须放在上面的花的右边,每一种搭配方式有一个欣赏值,求这个值的和的最大值。
很简单,就直接用DP[i][j]表示到i,j时候的最大欣赏值
DP[i][j]=MAX(DP[i][j-1],DP[i][j]+DP[i-1][j-1]);
但我却忽略了可能都为负数的情况,所以不能全部直接memset(0);DP[i][0]=-INF这样才对!!!
#include <stdio.h> #include <string.h> int main() { char s[100005]={0},t[100005]={0}; while(~scanf("%s %s",s,t)) { int a=strlen(s),b=strlen(t); bool DP = true; int p=0,q=0; while(p<a && q<b) { while(q<b && s[p] != t[q]) { q++; } if(q<b && s[p] == t[q]) { p++; q++; } } if(p!=a && q==b)DP=false; printf("%s\n",DP?"Yes":"No"); } return 0; }
View Code
最后就是这道题,坑死人!!!!!!!!!!!!!
感觉不像是DP,没有DP做,但是错了很多次,还是写一下。前面两次是OLE,不明原因。。。。。
改为不是多组输入后。就。。。。。(但我的多组输入没问题啊!!!!)
思路就是每一个顶点的度数除以这个并查集内所有度的和就是这个定点所占的比例。那就只需要并查集一下就可以了。然后就是每加一条边,这个并查集内的总和就+2,定点+1。
把总的值保留在根节点中就可以了。。num[a]是以a为根节点的次并查集总度数,ma[a]就是总和
但题目坑爹的就在于说那个值是实数而且最后的结果保留三位小数,这样又WA了两次
#include <cstdio> #include <cstring> #define MAXN 105 using namespace std; int p[MAXN],sum[MAXN],d[MAXN],num[MAXN]; double ma[MAXN]; int N,M; int find(int x) { return x==p[x]?x:p[x]; } void merg(int x,int y) { d[x]++;d[y]++; int a = find(x); int b = find(y); if(a != b) { if(a<b){p[b]=a;ma[a]+=ma[b];num[a]+=2;} else {p[a]=b;ma[b]+=ma[a];num[b]+=2;} } else num[a]+=2; } int main() { int T; scanf("%d",&T); while(T--) { int i,a,b; memset(sum,0,sizeof(sum)); memset(num,0,sizeof(num)); memset(d,0,sizeof(d)); scanf("%d%d",&N,&M); for(i=1;i<=N;i++) { scanf("%lf",&ma[i]);//输入的是实数。。。 p[i]=i; } for(i=1;i<=M;i++) { scanf("%d%d",&a,&b); merg(a,b); } for(i=1;i<=N;i++) { if(!d[i]){printf("%.3lf\n",ma[i]);continue;}//保留三位小数 else printf("%.3lf\n",(double)(d[i]*ma[p[i]])/(double)num[p[i]]); } printf("\n"); } return 0; }
不管怎么说,这篇就当做是提醒自己看题吧,尤其是英文题,特别要注意!!!!!!!!!!!!!!
相关文章推荐
- 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
- 【DP动态规划】个人常用基础动态规划DP小总结【TODO】
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- hdu 4669 动态规划
- 求最长等差数列(动态规划)
- 算法导论,动态规划 —— 最长公共子序列问题(LCS)优化python示例
- hdu 4412 利用单调性的动态规划
- HDU1003 动态规划,最大子序列之和
- 转载:动态规划以及路径记录
- 记忆动态规划分析类杨辉三角形问题
- DP 动态规划 Problem W 1023 背包
- C语言学习笔记(XI)---动态规划之“01背包”
- 九度OJ 题目1532:棋盘寻宝扩展(动态规划)
- 1625 - Color Length——[动态规划]
- AtCoder Regular Contest 066 E - Addition and Subtraction Hard 动态规划
- 动态规划(三)--矩阵链乘法
- 蓝桥杯 算法训练 最大的算式 (动态规划)
- 【BZOJ1040】骑士(动态规划)
- ural 1146. Maximum Sum(动态规划)
- Vijos_1218_数字游戏_(划分型动态规划+环状动态规划)