聪明的美食家(动态规划)

聪明的美食家(动态规划)

题目描述:如果有人认为吃东西只需要嘴巴,那就错了。
都知道舌头有这么一个特性,“由简入奢易,由奢如简难”(据好事者考究,此规律也适合许多其他情况)。具体而言,如果是甜食,当你吃的食物不如前面刚吃过的东西甜,就很不爽了。
大宝是一个聪明的美食家,当然深谙此道。一次他来到某小吃一条街,准备从街的一头吃到另一头。为了吃得爽,他大费周章,得到了各种食物的“美味度”。他拒绝不爽的经历,不走回头路而且还要爽歪歪(爽的次数尽量多)。

输入两行数据。
第一行为一个整数n,表示小吃街上小吃的数量
第二行为n个整数,分别表示n种食物的“美味度” 输出一个整数,表示吃得爽的次数 样例输入10
3 18 7 14 10 12 23 41 16 24
样例输出6

题目的模型就是最长上升子序列模型,是动态规划的基础题。题目含义是给出一串数字,求出按数字从小到大排序的所有组合中所含元素个数最多的组合。
3 18 7 14 10 12 23 41 16 24中 3 7 14 10 23 41是元素个数最多的组合方式。

状态转移方程dp[i]代表以第i个数为结尾吃的爽的最多次数,i从1枚举到n(小吃街上小吃的数量)

假设当前枚举到第i个数,那么根据题意dp[i]应该是前i个数中包含元素最多的组合,那么为了保证dp[i]这个组合是含元素最多的解,那么必须确保这个dp[i]组合中以倒数第二个元素为结尾的子组合也必须是最优解,为了确定以倒数第二个元素为结尾的组合是最优解我们需要对1~i-1的dp[i]选取最优解 dp[i]=max(dp[i],dp[j]+1);

废话不多说上代码····················································································

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1005;
int eat[N];
int dps[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>eat[i];
        dps[i]=1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(eat[j]<=eat[i])
            {
                dps[i]=max(dps[i],dps[j]+1);
            }
        }
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
        res=max(res,dps[i]);
    }
    cout<<res;
}
发布了10 篇原创文章 · 获赞 0 · 访问量 196

猜你喜欢

转载自blog.csdn.net/weixin_44460602/article/details/104408136
今日推荐