zoukankan      html  css  js  c++  java
  • bzoj1750 [Usaco2005 qua]Apple Catching

    Description

    It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree, so she must wait for them to fall. However, she must catch them in the air since the apples bruise when they hit the ground (and no one wants to eat bruised apples). Bessie is a quick eater, so an apple she does catch is eaten in just a few seconds. Each minute, one of the two apple trees drops an apple. Bessie, having much practice, can catch an apple if she is standing under a tree from which one falls. While Bessie can walk between the two trees quickly (in much less than a minute), she can stand under only one tree at any time. Moreover, cows do not get a lot of exercise, so she is not willing to walk back and forth between the trees endlessly (and thus misses some apples). Apples fall (one each minute) for T (1 <= T <= 1,000) minutes. Bessie is willing to walk back and forth at most W (1 <= W <= 30) times. Given which tree will drop an apple each minute, determine the maximum number of apples which Bessie can catch. Bessie starts at tree 1.

    Input

    * Line 1: Two space separated integers: T and W * Lines 2..T+1: 1 or 2: the tree that will drop an apple each minute.

    Output

    * Line 1: The maximum number of apples Bessie can catch without walking more than W times.

    Sample Input


    7 2
    2
    1
    1
    2
    2
    1
    1

    INPUT DETAILS:

    Seven apples fall - one from tree 2, then two in a row from tree 1, then
    two in a row from tree 2, then two in a row from tree 1. Bessie is
    willing to walk from one tree to the other twice.

    Sample Output


    6

    OUTPUT DETAILS:

    Bessie can catch six apples by staying under tree 1 until the first two
    have dropped, then moving to tree 2 for the next two, then returning back
    to tree 1 for the final two.

    题意是一个人站在树下接苹果,树只有两棵,每一个时刻只有一棵树有苹果掉下来,但是人只能从一棵树移到另一棵树最多m次,求最多能接多少个苹果

    dp太水了,f[i][j][0 / 1]表示第i时刻已经移动了j次,当前在第1 / 2棵树下的方案,然后转移自己yy一下吧。或者直接看代码

    #include<cstdio>
    inline int max(int a,int b)
    {return a>b?a:b;}
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,mx;
    int f[1001][1001][2];//Ç° i ¸ö¡¢Òƶ¯ j ²½¡¢µ±Ç°Î»ÖÃÊÇ1/2
    int a[1001][2];
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++)
    	{
    		int x=read();
    		a[i][x-1]=1;
    	}
    	for (int i=1;i<=n;i++)
    	{
    	  f[i][0][0]=f[i-1][0][0]+a[i][0];
    	  f[i][0][1]=f[i-1][0][1]+a[i][1];
    	  for (int j=1;j<=m;j++)
    	    {
    	    	f[i][j][0]=max(f[i-1][j-1][1],f[i-1][j][0])+a[i][0];
    	    	f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j][1])+a[i][1];
    	    	mx=max(mx,f[i][j][0]);
    	    	mx=max(mx,f[i][j][1]);
    	    }
    	}
    	printf("%d
    ",mx);
    }

    然后我再想了下,好像我们把相邻的相同的数字缩成一个数,用缩掉的数字的个数表示,然后求长度为m+1的最大子串和

    比如样例:

    7 2

    2|1 1|2 2|1 1缩成1 2 2 2

    然后显然答案是2 2 2即6

    但是有反例

    7 2

    1 2 1 2 1 2 2

    答案是5,这样做是4

    我想不用多解释了吧

    所以还是老老实实dp吧

    ——by zhber,转载请注明来源
  • 相关阅读:
    zoj 1002 Fire Net 碉堡的最大数量【DFS】
    hdu 2553 n皇后问题【DFS递归解法】
    UVa11988 Broken Keyboard 损坏的键盘【list】
    hdu 1263 水果 【二维map】
    UVa-156 Ananagrams 反片语【map】【vector】
    hdu 2364 Escape【模拟优先队列】【bfs】
    UVA136 Ugly Numbers【set】【优先队列】
    hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】
    广搜bfs
    DP:Corn Fields(POJ 3254)
  • 原文地址:https://www.cnblogs.com/zhber/p/4036038.html
Copyright © 2011-2022 走看看