ccpc wannafly 秦皇岛E kingdom【树形dp】【已修正】

这个题目是一个树形dp ,我们记F[i] 为 总数为i的时候的结果,
g[i][j] 表示的 总数为i ,心腹的子树结点为j的情况
所以,根据背包 g[i][j] = max(g[i][j-1],g[i-j][j]+f[j])
第一种情况就是多出的一个结点接在左边,那么这个节点作为心腹的话,就不会有贡献,另一种情况就是把结点接在右边,那么左边j个结点作为心腹的话,最多为f[j] 然后其余的i-j-1个结点在右边 的时候应该会多出 i-j+1的贡献,所以我们在计算 f[j]的时候要把这一部分算上。。

之前只过了一部分的数据,直到牛客重现了,看了大佬的代码,才修正了
我们在更新g[i][j]的时候 我之前只更新了一部分,应该要更新到n才对

#include <bits/stdc++.h>
using namespace std;
const int maxn=8000+100;
typedef long long ll;
int f[maxn];
int g[maxn][maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++)
    {
        for(int j=1;j<=i;j++)
        {
            f[i]=max(g[i][j]+(i-j-1),f[i]);
        }
        for(int j=1;j<=n+1;j++)
        {
            if(j<=i)
            g[i+1][j] = max(g[i+1][j-1],g[i+1-j][j]+f[j]);
            else g[i+1][j]=g[i+1][j-1];
        }
    }

    printf("%d\n",f[n]);

    return 0;
}


全部评论

相关推荐

湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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