【动态规划】bzoj1663 [Usaco2006 Open]赶集

http://blog.csdn.net/u011265346/article/details/44906469

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 401
struct Point{int p,v;}a[N];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int n,map[N][N],f[N];
int main()
{
//  freopen("bzoj1663.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
      {
        scanf("%d",&a[i].v);
        a[i].p=i;
      }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j)
        scanf("%d",&map[i][j]);
    for(int i=1;i<=n;++i)
      if(map[1][a[i].p]<=a[i].v)
        f[i]=1;
    for(int i=1;i<=n;++i)
      for(int j=1;j<i;++j)
        if(a[j].v+map[a[j].p][a[i].p]<=a[i].v)
          f[i]=max(f[i],f[j]+1);
    printf("%d\n",*max_element(f+1,f+1+n));
    return 0;
}
时间: 2024-08-01 10:34:01

【动态规划】bzoj1663 [Usaco2006 Open]赶集的相关文章

bzoj1663 [Usaco2006 Open]赶集 (最短路)

Description 每一年,约翰都会带着他的奶牛们去赶集.集会中一共有N(1≤N≤400)个商店,第i个商店会在特定的时间Pi(0≤Pi≤109)对当时在店里的顾客送出一份精美的礼物.约翰当然得到了这个消息,于是他希望能拿到尽量多的礼物送给他的奶牛们.也就是说,他想尽可能多地在某商店发放礼物的时候,正好呆在店里. 经过一定的调查,约翰弄清楚了从i号商店走到J号商店所需要的时间Ti,j(1≤Ti,j≤1000000).虽然乡间小路奇特的布局使得从i号商店走到j号商店的最短路不一定是直接连接这两

[BZOJ1663] [Usaco2006 Open]赶集(spfa最长路)

传送门 按照时间t排序 如果 t[i] + map[i][j] <= t[j],就在i和j之间连一条边 然后spfa找最长路 #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 401 using namespace std; int n, ans, cnt; int a[N][N],

BZOJ1663: [Usaco2006 Open]赶集

n<=400个地点第Ai秒会出礼物,给一个邻接矩阵描述地点间的路径耗时,去下一个地点只能走直接相连的路径(不一定最短路),求最多能拿多少. 有点水的DP..f[i]表示去拿第i个(时间顺序)礼物最多能拿多少,f[i]=max(f[j]+1),其中时间允许从j走到i. 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 //#inclu

【动态规划】bzoj1669 [Usaco2006 Oct]Hungry Cows饥饿的奶牛

#include<cstdio> #include<algorithm> using namespace std; int n,a[5001],b[5001],en; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i) { int *p=lower_bound(b+1,b+en+1,a

【动态规划】bzoj1649 [Usaco2006 Dec]Cow Roller Coaster

很像背包. 这种在一个数轴上进行操作的题常常需要对区间排序. f[i][j]表示距离到i时,花费为j时的权值之和. f[x[i]+l[i]][j+c[i]]=max{f[x[i]][j]+w[i]}(1<=i<=n,0<=j<=B) #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Line{int x,l,w,c;}a[10001

[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1297  Solved: 705 [Submit][Status][Discuss] Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". John的牛奶按质量可以被赋予一个0到100

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s