小菜吃鸡腿

小菜吃鸡腿

特别裸的区间 dp ,而且之前还写过一样的题,居然没写出来,55555,主要还是因为把区间 dp 的思路给忘了

区间 dp 的主要思路:假设有一段区间[l,r],当lr缩为最小的单位区间的时候肯定会有一个初始值,这个是无疑的,然后当[l,r]的区间长度扩大的时候,尝试去在区间内找一个k使得这整个区间[l,r]的值为最大(即满足题目要求)。

整理一下区间 dp 的几个步骤:

总共三个for

第一个 遍历区间长度len

第二个遍历起始位置即得出lr的坐标,即可得到区间[l,r]

第三个遍历区间[l,r]的切分点k,从而找到最满足条件的dp[l][r](最大值或最小值)

代码:

// Created by CAD on 2019/8/21.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll dp[60][60];
int w[55];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=1;i<=n;++i) cin>>w[i];
    for(int k=3;k<=n;++k)
        {
            for (int l=1; l+k-1<=n; ++l)
            {
                int r=l+k-1;
                for(int i=l+1;i<=r-1;++i)
                    dp[l][r]=max(dp[l][r],dp[l][i]+dp[i][r]+w[l]*w[r]);
            }
        }
    cout<<dp[1][n]<<endl;
    return 0;
}

递归版本:

// Created by CAD on 2019/8/21.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll dp[60][60];
int w[55];
ll dfs(int l,int r)
{
    ll &ret=dp[l][r];
    if(l>r) return 0;
    if(ret) return ret;
    for(int k=l+1;k<=r-1;++k)
        ret=max(ret,dfs(l,k)+dfs(k,r)+w[l]*w[r]);
    return ret;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=1;i<=n;++i) cin>>w[i];
    cout<<dfs(1,n)<<endl;
    return 0;
}

貌似感觉递归写起来更加方便些

全部评论

相关推荐

泽哥的小屋:目前的简历结构有些杂乱,重点不够突出,HR在短时间内可能抓不住你的核心优势。以下是我针对运营方向(电商运营/用户运营/产品运营等)给出的具体修改建议,你可以照着调整。 1.目前内容偏多,建议精简到一页,删掉冗余描述 2. 保留学校、专业、GPA/排名、奖学金,删掉“核心能力”里的大段描述(这部分可以放到技能或总结里) 3. 闲鱼店铺运营是最大亮点,完全匹配电商运营/用户运营。建议独立成段,并强化运营动作和结果。原文偏流水账,可以拆成3-4个小点,用数据说话。 4. 校园经历这部分可以合并,挑2-3个最有代表性的,用运营语言改写。 5. 生物信息学项目与运营关联较弱,但可以突出数据分析能力。建议改写为强调数据清洗、可视化、分析等技能,并说明这些能力如何用于运营决策 6. 在简历顶部可以加一句简短的个人总结,例如: 具备数据分析能力和闲鱼电商实战经验的运营新人,擅长从0到1项目落地与用户运营,追求用数据驱动增长 还有其他问题可以私信咨询我
非技术求职现状
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务