zoukankan      html  css  js  c++  java
  • Luogu P2690 接苹果

    题目背景

    USACO

    题目描述

    很少有人知道奶牛爱吃苹果。农夫约翰的农场上有两棵苹果树(编号为1和2), 每一棵树上都长满了苹果。奶牛贝茜无法摘下树上的苹果,所以她只能等待苹果 从树上落下。但是,由于苹果掉到地上会摔烂,贝茜必须在半空中接住苹果(没有人爱吃摔烂的苹果)。贝茜吃东西很快,她接到苹果后仅用几秒钟就能吃完。每一分钟,两棵苹果树其中的一棵会掉落一个苹果。贝茜已经过了足够的训练, 只要站在树下就一定能接住这棵树上掉落的苹果。同时,贝茜能够在两棵树之间 快速移动(移动时间远少于1分钟),因此当苹果掉落时,她必定站在两棵树其中的一棵下面。此外,奶牛不愿意不停地往返于两棵树之间,因此会错过一些苹果。苹果每分钟掉落一个,共T(1<=T<=1000)分钟,贝茜最多愿意移动W(1<=W<=30) 次。现给出每分钟掉落苹果的树的编号,要求判定贝茜能够接住的最多苹果数。 开始时贝茜在1号树下。

    输入输出格式

    输入格式:

    第一行2个数,t和k。接下来的t行,每行一个数,代表在时刻t苹果是从1号苹果树还是从2号苹果树上掉下来的。

    输出格式:

    对于每个测试点,输出一行,一个数,为奶牛最多接到的苹果的数量。

    输入输出样例

    输入样例#1:
    7 2
    2
    1
    1
    2
    2
    1
    1
    
    输出样例#1:
    6
     
    解题思路:

    主要思路:这道题是一道很简单的记忆化搜索的题目.

    我们可以这样想:每次只有两种决策,就是换位置或者不换.

    我们得知道哪一种能得到的苹果数最多,我们就选哪一种.

    这样,我们就可以看出了这道题的子问题.

    我们可以用DP[i][j][k]来表示在第i个时间上,转换了j次位置,现在在k,最多能拿到多少苹果?

    状态转移方程就出来了:DP[i][j][k]=max(DP[i+1][j+1][3-k],DP[i+1][j][k]).

    但是要注意,如果当前这个点能够吃到苹果的话,苹果数还得加一.

    //这是记忆化搜索!
    #include<bits/stdc++.h>
    using namespace std;
    int read()
    {
    int ret=0,ok=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
    if(ch=='-')ok=-1;
    ch=getchar();
    }
    for(;ch>='0'&&ch<='9';ch=getchar())
     ret=ret*10+ch-'0';
    return ret*ok;
    }
    int t,k;
    int a[5500];
    int dp[2500][2500][3];
    inline int dfs(int time,int sum,int now)//time是现在的时间,sum是换了几次位置,now是现在的位置
    {
        if(time>t||sum>k)//如果越界
        {
            return 0;
        }
        if(dp[time][sum][now]!=0)//如果已经求过解
        {
            return dp[time][sum][now];
        }
        dp[time][sum][now]=max(dfs(time+1,sum+1,3-now),dfs(time+1,sum,now));//前者是换位置,后者是不换
        if(a[time]==now)//如果当前这个位置当前这个时间能吃到苹果
        {
            dp[time][sum][now]++;//苹果数加一
        }
        return dp[time][sum][now];//返回 
    }
    
    int main()
    {
    //freopen("apple.in","r",stdin);
    //freopen("apple.out","w",stdout);
    t=read(),k=read();
    for(int i=1;i<=t; i++)
    {
    a[i]=read(); 
    }
    dfs(1,0,1); 
    cout<<dp[1][0][1];
        return 0;
    }
    //这是DP
    #include<bits/stdc++.h>
    using namespace std;
    int read()
    {
    int ret=0,ok=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
    if(ch=='-')ok=-1;
    ch=getchar();
    }
    for(;ch>='0'&&ch<='9';ch=getchar())
     ret=ret*10+ch-'0';
    return ret*ok;
    }
    int a[5000];
    int t,k;
    int dp[2500][3];
    int main()
    {
    //freopen("apple.in","r",stdin);
    //freopen("apple.out","w",stdout);
    t=read(),k=read();
    for(int i=1;i<=t;i++)
    {
        a[i]=read();
    }
    for(int i=1;i<=t;i++)
    {
        for(int j=k;j>=0;j--)
        {
            if(j>0)
            {
                dp[j][a[i]]=max(dp[j][a[i]]+1,dp[j-1][3-a[i]]+1);
            }
            else if(a[i]==1)
            dp[j][a[i]]++;
        }
    }
    cout<<max(dp[k][1],dp[k][2]);
        return 0;
    }
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/Hammer-cwz-77/p/7343850.html
Copyright © 2011-2022 走看看