SOJ 2505: The County Fair

来源:互联网 发布:网络设计师卡通图片 编辑:程序博客网 时间:2024/06/11 18:37

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

其实这不怪我啊。。。

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

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

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

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

于是翻翻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 0x3f3f3f3fusing 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);}}


原创粉丝点击