bzoj1017 [JSOI2008]魔兽地图DotR——DP

 题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017

好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量;

g[i][j]用在子树中,表示前i个子树花j钱的最大值;

调了半上午,终于发现原来是少看了一个范围,f的第二维的范围不是51而是100啊啊啊啊啊啊!

除此之外此题也有很多要注意的地方,写在注释里了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=55,maxm=2005,inf=1000000000;
int n,m,L[maxn],M[maxn],P[maxn],head[maxn],ct;
int f[maxn][maxn<<1][maxm],g[maxn][maxm],rd[maxn],h[maxn][maxm];
struct N{
    int to,next,w;
    N(int t=0,int n=0,int w=0):to(t),next(n),w(w) {}
}edge[20005];
void dp(int x)
{
    if(!head[x])//叶子 
    {
        L[x]=min(L[x],m/M[x]);//!
        for(int i=0;i<=L[x];i++)//有i个 
            for(int j=0;j<=i;j++)//贡献j个 
                f[x][j][M[x]*i]=P[x]*(i-j);
        return;//!!!!!!!!!!
    }
    L[x]=inf;//!高级装备原本没有限制 
    for(int i=head[x],u;i;i=edge[i].next)
    {
        u=edge[i].to;
        dp(u);
        L[x]=min(L[x],L[u]/edge[i].w);
        M[x]+=M[u]*edge[i].w;//
    }
    L[x]=min(L[x],m/M[x]);
    memset(g,-0x3f,sizeof g);//!!
    g[0][0]=0;//!!
    for(int l=L[x];l>=0;l--)//x物品有l个  //倒序!  //l可以有0个!!!!!!!!!!! 
    {
        int tot=0;
//        memset(g,0,sizeof g);//放在外面! 
        for(int i=head[x],v;i;i=edge[i].next)
        {
            v=edge[i].to;
            tot++;
            for(int j=0;j<=m;j++)//一共有j钱 
                for(int k=0;k<=j;k++)//给v k钱 
                    g[tot][j]=max(g[tot][j],g[tot-1][j-k]+f[v][l*edge[i].w][k]);
                    //g每次不会重新赋初值,所以需要l倒序来保证本次一定可以合成l个x物品 
        }
        for(int j=0;j<=l;j++)
            for(int k=0;k<=m;k++)
                f[x][j][k]=max(f[x][j][k],g[tot][k]+P[x]*(l-j));
    } 
}
int main()
{
    scanf("%d%d",&n,&m);
    char dc;
//    memset(L,0x3f,sizeof L);
    memset(f,-0x3f3f3f3f,sizeof f);
    for(int i=1,x,a,b;i<=n;i++)
    {
        scanf("%d",&P[i]);
        cin>>dc;
        if(dc=='A')
        {
            scanf("%d",&x);
            while(x--)
            {
                scanf("%d%d",&a,&b);
                edge[++ct]=N(a,head[i],b);head[i]=ct;
                rd[a]++;
            }
        }
        else scanf("%d%d",&M[i],&L[i]);
    }
    int tot=0;
    for(int i=1;i<=n;i++)
        if(!rd[i])
        {
            tot++;
            dp(i);
            for(int j=0;j<=m;j++)
                for(int k=0;k<=j;k++)
                    for(int l=0;l<=L[i];l++)
                        h[tot][j]=max(h[tot][j],h[tot-1][k]+f[i][l][j-k]);
        }
    int ans=0;
    for(int j=0;j<=m;j++)ans=max(ans,h[tot][j]);
    printf("%d\n",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/Zinn/p/9139072.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能最强大的Jass编辑器更新 1.4.3.3 -> 1.4.3.4[!] 修正了当字符串或注释中存在括号时括号提示的显示错误问题;[!] plugin(插件)菜单不再可以使用任意热键;[!] 修正了Shortcut Manager的程序运行期间内存泄露问题;[!] 修正了打开某些地图文件时Global List中Triggers可能产生严重错误的问题;[+] 增加了提示无对应的括号的提示(该功能默认关闭);[+] 保存脚本文件到地图文件中时自动删除"(attributes)"文件;[+] 在config.exe中增加了关联地图类型文件(*.W3M, *.W3X)功能(使用该功能时请选择“否”,否则将覆盖掉原来使用WE打开的关联方式);[+] Shortcut Manager的热键选择列表中去除plugin菜单已使用的热键; 将UTF8<->ASC功能移动到Format All/Selected Text菜单下; 提高了文件较长时的一些相关功能的效率。文件说明JassShopPro.exe - 主程序config.exe - 设置程序。许多JSP有许多强大的功能需要调用该文件来设定MpqLib.dll - 用于直接读取地图中的jass文件的动态链接库(Thx to Soar)CHS.lng - 简体中文语言包。建议每次更新都覆盖掉default.tmt - 模板文件。这是一个文本文件,可以根据该文件内容(挺容易懂的)设计自定义的模板菜单,支持快捷键和一些控制命令。可以通过config.exe定义自己的模板菜单文件common.j, blizzard.j, common.ai - 目前为1.18的API文件,主程序至少需要common.j文件pjass.exe - 用于语法检查,无此文件,主程序中的语法检查将不可用jsp.ini - JassShopPro.exe会自动创建该文件,用于保存设置,无此文件时config.exe不可用。当首次运行JassShopPro的时候,如果没有找到这个文件,程序会自动搜索并提问是否使用语言包(语言包有特殊的设定,如果是某些英文版改的中文版xp的或者新加坡中文版之类,不会自动提问CHS.lng)功能 语法高亮 根据jass2语言定义了十几种字体,可以通过config.exe自己设定字体颜色、风格,以及高亮规则 智能大小写转换 可自动转换大小写,并能自动判断是否进行大小写转换,例如输入 “location”,此时如果再输入“(”,程序将认为它是函数,自动转换成“Location(”,否则认为是类型,不进行大小写转换 快速函数搜索 可以方便快捷的查找API函数、常量、变量、类型。可以选择是否从名称第一个字母开始匹配,是否注意大小写,该函数的返回类型或变量、常量的类型。搜索按钮将自动在所有函数/变量常量/类型中查找。按回车或者空格会将当前词汇添加到下拉菜单中。单击其中条目,下面的代码框中将显示源代码,双击搜索列表中项目,将自动插入代码 标准的MDI(多文档界面)操作 Ctrl+F4关闭一个文档,Ctrl+Tab切换文档 功能强大的搜索功能 有丰富的选项,在主界面编辑时会智能填入搜索内容。如选中代码不含有换行符,搜索对话框中将自动填入选中的文本,超过一行则会自动将搜索范围变为 Selected Text (选中文本) 书签功能 每个编辑中的文本可以定义10个书签 当前代码结构 左侧的列表会显示全部的全局变量、函数、全局Trigger。红色的变量代表常量,红色的函数代表常函数,红色的Trigger代表缺乏全局变量声明的T。目前Trigger列表只是列出来,没有任何实际功能。对于变量和函数,左键单击在代码框中显示代码,右键单击跳转到声明位置,双鞑迦耄孛旖菁麱2 )会在整个编辑文本中改名 强大的模板引擎 具体可以参照Default.tmt文件,可以自定义类别,自定义快捷键,做一些比较复杂的功能 语法检查 该功能需要pjass.exe文件。可以在检查结果中双击条目跳转到出错位置 测试地图 现在程序已经支持直接打开地图文件中的war3map.j或者scripts\war3map.j文件,或者直接储存到地图文件中。如果正在编辑的是地图文件,可立刻使用WE的标准操作快捷键Ctrl+F9进行地图测试 插入颜色 可以直观的选择颜色,然后转换成jass的颜色代码插入到文本中 强大的文本缩进 可通过config.exe设置tab键的宽度,编辑代码时也会根据关键词进行缩进。菜单中提供了缩进、去除缩进、增加缩进功能,自动根据是否选中文本对选中代码或者全文进行缩进处理,方便阅读 与WE通信 可以直接与WE的文本编辑框通信,相互复制代码 UTF-8 <-> ASC 人性化的操作 主程序支持参数,可以通过config.exe在注册表中注册文件类型,从而双击打开相关类型文件。如果已经有一个JassShopPro在运行中,再次双击注册为用JSP打开的类型的文件时,将在已启动的文档中打开文件。同样,支持拖放操作,可以直接将文件拖到窗口中打开 自动完成功能 输入“set ”,将自动显示本地变量与全部全局变量;输入“call ”,则会自动显示当前代码前面的全部函数。输入一个有效的函数名称并按“(”时,将显示该函数参数的提示(或者按F1) 丰富的快捷键 大多数有用的功能都提供了快捷键。 Ctrl+鼠标左键单击(F2):如果大小写不正确,会自动转换大小写。如果被点中的是当前文档的全局变量、常量或者函数,则会自动跳转到声明位置 双击:可在代码框中得到相关的源代码 压缩代码 可以进行一些简单的代码压缩处理,可以处理:去除注释,压缩全局变量、常量名称,压缩函数名称,去除无用回车,去除缩进等 自定义菜单快捷键 主程序中的Shortcut Manager可以方便帮助您设置菜单中的快捷键,方便需要 plug-in 支持插件程序,可以通过config.exe方便的管理已安装的插件。
题目描述 有一个 $n$ 个点的棋盘,每个点上有一个数字 $a_i$,你需要从 $(1,1)$ 走到 $(n,n)$,每次只能往右或往下走,每个格子只能经过一次,路径上的数字和为 $S$。定义一个点 $(x,y)$ 的权值为 $a_x+a_y$,求所有满足条件的路径中,所有点的权值和的最小值。 输入格式 第一行一个整数 $n$。 接下来 $n$ 行,每行 $n$ 个整数,表示棋盘上每个点的数字。 输出格式 输出一个整数,表示所有满足条件的路径中,所有点的权值和的最小值。 数据范围 $1\leq n\leq 300$ 输入样例 3 1 2 3 4 5 6 7 8 9 输出样例 25 算法1 (树形dp) $O(n^3)$ 我们可以先将所有点的权值求出来,然后将其看作是一个有权值的图,问题就转化为了在这个图中求从 $(1,1)$ 到 $(n,n)$ 的所有路径中,所有点的权值和的最小值。 我们可以使用树形dp来解决这个问题,具体来说,我们可以将这个图看作是一棵树,每个点的父节点是它的前驱或者后继,然后我们从根节点开始,依次向下遍历,对于每个节点,我们可以考虑它的两个儿子,如果它的两个儿子都被遍历过了,那么我们就可以计算出从它的左儿子到它的右儿子的路径中,所有点的权值和的最小值,然后再将这个值加上当前节点的权值,就可以得到从根节点到当前节点的路径中,所有点的权值和的最小值。 时间复杂度 树形dp的时间复杂度是 $O(n^3)$。 C++ 代码 算法2 (动态规划) $O(n^3)$ 我们可以使用动态规划来解决这个问题,具体来说,我们可以定义 $f(i,j,s)$ 表示从 $(1,1)$ 到 $(i,j)$ 的所有路径中,所有点的权值和为 $s$ 的最小值,那么我们就可以得到如下的状态转移方程: $$ f(i,j,s)=\min\{f(i-1,j,s-a_{i,j}),f(i,j-1,s-a_{i,j})\} $$ 其中 $a_{i,j}$ 表示点 $(i,j)$ 的权值。 时间复杂度 动态规划的时间复杂度是 $O(n^3)$。 C++ 代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值