SOJ 2505: The County Fair

刚刚发现我这个博客里怎么写的全部都是图论类的题解啊。。。。就算是网络流和二分图也是一种特殊的图论嘛= 。=

其实这不怪我啊。。。

还不是因为前一阵子被超哥吐槽说训练强度太低。。。

我也不知道在他眼中我到底做啥题才能算是提高训练强度了 =。=

于是就狂刷了一阵子网络流和线段树。。

然后我觉得线段树这种数据结构的题还不是考对代码的统筹能力,又没啥好写的= =

于是翻翻solution就全是网络流啊撒鼻息。。。惊恐


换换口味,写道DP吧。。。

顺便又可以给我的博客加个分类了嘿嘿嘿。。偷笑


题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=2505

题目大意:有一些村庄,各个村庄间有一些长短不一的道路,每个村庄都有一个办法奖励的时间Pi。一个人从村庄1开始游历。但是有一个特殊的规则:他每到达一个村庄,都必须在那里获得一个奖励,否则他不肯动身去这个村庄(这个条件太坑爹啊)


算法:

就是个普通的生成类DP,初始化很重要

因为只有从村庄1出发是不一定要等到时间P1的,从其它村庄出发都必须等到时间Pi拿到奖励才走

(题面中规定“:he will only walk from booth i to booth j in the event that he can actually collect a fabulous prize at booth j.)

所以对于任何w(1,i)<Pi的城市d[i]=1,否则d[i]=0;

然后按照Pi排序,因为从任何一个村庄(除了村庄1)肯定是不可能走到Pi比它早的村庄去的(因为去了之后等到地老天荒也拿不到奖励。。)

然后对于任何Pi+w(i,j)<=Pj的i和j,d[j]=max(d[i]+1,d[j])。


#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;

typedef struct
{
int a,b;
}node;

bool cmp(const node& x,const node& y)
{
return x.a<y.a;
}

int d[450],cap[450][450];
node p[450];

int main()
{
int n,i,j,k,ans;
while(scanf("%d",&n)==1)
{
memset(d,-INF,sizeof(d));
ans=0;
for(i=1;i<=n;i++)
{
p[i].b=i;
scanf("%d",&p[i].a);
}
sort(p+1,p+1+n,cmp);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&cap[i][j]);
for(k=1;p[k].b!=1;k++);
for(i=1;i<=n;i++)
if(cap[p[k].b][p[i].b]<=p[i].a)
d[i]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
{
if(p[j].a+cap[p[j].b][p[i].b]<=p[i].a)d[i]=d[i]>d[j]+1?d[i]:d[j]+1;
}
ans=ans>d[i]?ans:d[i];
}
printf("%d\n",ans);
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值