您的位置:首页 > 其它

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这样才对!!!

#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;
}


不管怎么说,这篇就当做是提醒自己看题吧,尤其是英文题,特别要注意!!!!!!!!!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: