题目链接:http://poj.org/problem?id=3249

思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4000ms险过。

之后有写了个dfs记忆化搜索,果然快多了。

bfs AC code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 100100
#define MAXM 2002000
#define inf 1<<30 struct Edge{
int v,next;
}edge[MAXM]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int In_degree[MAXN],Out_degree[MAXN];
int dp[MAXN],value[MAXN];
bool mark[MAXN]; void bfs()
{
queue<int>que;
fill(dp,dp++n,-inf);
memset(mark,false,(n+)*sizeof(bool));
for(int i=;i<=n;i++)if(In_degree[i]==){
mark[i]=true;
dp[i]=value[i];
que.push(i);
}
while(!que.empty()){
int u=que.front();
que.pop();
mark[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(dp[u]+value[v]>dp[v]){
dp[v]=dp[u]+value[v];
if(!mark[v]){
mark[v]=true;que.push(v);
}
}
}
}
} int main()
{
int u,v,ans;
while(~scanf("%d%d",&n,&m)){
NE=;
memset(head,-,(n+)*sizeof(int));
memset(In_degree,,(n+)*sizeof(int));
memset(Out_degree,,(n+)*sizeof(int));
for(int i=;i<=n;i++)scanf("%d",&value[i]);
while(m--){
scanf("%d%d",&u,&v);
Insert(v,u);
In_degree[u]++;
Out_degree[v]++;
}
bfs();
ans=-inf;
for(int i=;i<=n;i++){
if(Out_degree[i]==)ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return ;
}

dfs 记忆化 AC code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 100100
#define MAXM 2002000
#define inf 1<<30 struct Edge{
int v,next;
}edge[MAXM]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int In_degree[MAXN],Out_degree[MAXN];
int dp[MAXN],value[MAXN]; int dfs(int u)
{
if(dp[u]!=-inf)return dp[u];
dp[u]=value[u];
int ans=-inf;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
ans=max(ans,dfs(v));
}
if(ans!=-inf){
dp[u]+=ans;
}
return dp[u];
} int main()
{
int u,v,ans;
while(~scanf("%d%d",&n,&m)){
NE=;
memset(head,-,(n+)*sizeof(int));
memset(In_degree,,(n+)*sizeof(int));
memset(Out_degree,,(n+)*sizeof(int));
for(int i=;i<=n;i++)scanf("%d",&value[i]);
while(m--){
scanf("%d%d",&u,&v);
Insert(u,v);
In_degree[v]++;
Out_degree[u]++;
}
ans=-inf;
fill(dp,dp++n,-inf);
for(int i=;i<=n;i++){
if(In_degree[i]==){
ans=max(ans,dfs(i));
}
}
printf("%d\n",ans);
}
return ;
}

poj 3249(bfs+dp或者记忆化搜索)的更多相关文章

  1. 二进制数(dp,记忆化搜索)

    二进制数(dp,记忆化搜索) 给定k个<=1e6的正整数x(k不大于10),问最小的,能被x整除且只由01组成的数. 首先,dp很好写.用\(f[i][j]\)表示i位01串,模ki的值是j的数 ...

  2. poj1179 区间dp(记忆化搜索写法)有巨坑!

    http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...

  3. poj 1661 Help Jimmy(记忆化搜索)

    题目链接:http://poj.org/problem?id=1661 一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归 由于这是 ...

  4. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  5. 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470 Descrition 首先很明显是 ...

  6. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  7. noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)

    QWQ前几天才刚刚把这个D1T3写完 看着题解理解了很久,果然我还是太菜了QAQ 题目大意就是 给你一个n个点,m条边的图,保证1能到达n,求从1到n的 (设1到n的最短路长度是d)路径长度在[d,d ...

  8. poj 1085 Triangle War 博弈论+记忆化搜索

    思路:总共有18条边,9个三角形. 极大极小化搜索+剪枝比较慢,所以用记忆化搜索!! 用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解. 代码如下: #include<ios ...

  9. poj 1088 动态规划+dfs(记忆化搜索)

    滑雪 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Description Mi ...

随机推荐

  1. 使用wamp访问localhost时查看项目地址不对

    使用wamp访问localhost时查看项目地址不对 直接点击访问不到,http://路径少了一个localhost. 怎么办呢? 找到wamp 的www 目录下的index.php 文件打开后 找到 ...

  2. javaScript Windows相关

    javaScript 关于Windows 1 Windows 对象 <1>全部浏览器都支持 window 对象.它表示浏览器窗体. <2>全部 JavaScript 全局对象. ...

  3. C#指南,重温基础,展望远方!(5)C#语句

    程序操作使用语句进行表示. C# 支持几种不同的语句,其中许多语句是从嵌入语句的角度来定义的. 使用代码块,可以在允许编写一个语句的上下文中编写多个语句. 代码块是由一系列在分隔符 { 和 } 内编写 ...

  4. C语言之文件操作08——总结

    C程序的文件操作共涵盖7个例题,包括格式打印,文件读取,条件查找,矩阵的文件操作,数据格式输入及调用计算等内容. 文件操作使得程序有更强的拓展性,使其能够单独保存数据.这为程序的调试和优化打下了坚实的 ...

  5. 12v继电器驱动电路

  6. 两个优秀的C标准库源代码

    gnu的基本看不懂,因为套了一层又一层复杂的东西. 我现在能看懂的2个c标准库是openbsd的,还有一个嵌入c的库. https://github.com/openbsd/src/tree/mast ...

  7. scut协议配置工具初始化的一些问题

    1.如果点击协议配置工具左上角的项目按钮没反应,说明数据库没有正确配置. 2.数据库创建脚本运行如果乱码,把utf-8改成ansi 3.如果ContractDB不存在就自行创建数据库. 4.使用sql ...

  8. 多线程-ThreadLocal,InheritableThreadLocal

    ThreadLocal 变量值得共享可以使用public static变量的形式,所有的线程都使用同一个public static变量.如果想实现每一个线程都有自己的共享变量该如何解决呢?JDK中提供 ...

  9. 真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)

    作为一种数据结构.红黑树可谓不算朴素.由于各种宣传让它过于神奇,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话.它最坏情况怎么怎么地...    ...

  10. linux之grub的使用

    一.引言 昨天在家里在自己的电脑上安装CentOS7,一切都顺利,结果安装好重启,无法进入win7了,在grub的配置文件也添加了win7的条目,却提示 unkown command chainloa ...