5359: [Lydsy1805月赛]寻宝游戏


Time Limit: 2 Sec  Memory Limit: 512 MB
Submit: 71  Solved: 19
[Submit][Status][Discuss]

Description


Input


 

Output


 

Sample Input


 

Sample Output


 

HINT


 

Source


鸣谢claris提供

分析:


(果然昨天月赛的时候选择打第五人格排位是正确的,要不做完t2就不会了QAQ)
dp状态定义很重要,很明显是选一条路径,其中有t个不选,从路径外选t个。
如果k = 0,就是做一遍O(nm)的经典dp
k > 0  :定义状态f[i][j][k][l],表示已考虑完以(1,1)为左上角,(i,j)为右下角的矩形,一条(1,1)到(i,j)的路径中有k个点不选,从外面选了l个点的最大价值。
预处理出g[i][j][k]((i,j + 1)~(i,m)中前k大之和),h[i][j][k] ((i + 1,j) ~(n,j)中前k大和),复杂度O(n^3logn)
转移起来就很简单了(记录每个点权值为s[i][j]):
f[i][j][k][l]  +  g[i][j][x] + s[i + 1][j] ----> f[i+1][j][k][l + x] (从右选了前x大,往下走)
f[i][j][k][l]  +  g[i][j][x] ----> f[i+1][j][k + 1][l + x] (从右选了前x大,往下走,且舍弃s[i + 1][j])
f[i][j][k][l]  +  h[i][j][x] + s[i][j + 1] ----> f[i][j + 1][k][l + x] (从下选了前x大,往右走)
f[i][j][k][l]  +  h[i][j][x] ----> f[i][j + 1][k + 1][l + x] (从下选了前x大,往右走,且舍弃s[i][j + 1])
初始化f[1][1][0][0] = s[1][1],f[1][1][1][0] = 0。就可以在O(n ^ 2k^3)转移了
最后答案就为max(f[n][m][t][t]),t∈[0,K]
(所以说dp定义状态比转移关键呢)

AC代码:


# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
using namespace std;
int f[][][][],a[],b[],s[][],g[][][],h[][][],n,m,K,dt;
bool cmp(int x,int y){return x > y;}
void init()
{
memset(g,,sizeof g);
memset(h,,sizeof h);
for(int i = ;i <= n;i++)
{
dt = ;
for(int j = m;j >= ;j--)
{
sort(a + ,a + dt + ,cmp);
for(int k = ;k <= dt;k++)b[k] = b[k - ] + a[k],g[i][j][k] = b[k];
a[++dt] = s[i][j];
}
}
for(int j = ;j <= m;j++)
{
dt = ;
for(int i = n;i >= ;i--)
{
sort(a + ,a + dt + ,cmp);
for(int k = ;k <= dt;k++)b[k] = b[k - ] + a[k],h[i][j][k] = b[k];
a[++dt] = s[i][j];
}
}
memset(f,0x80,sizeof f);
f[][][][] = s[][];
f[][][][] = ;
}
int main()
{
int Case;scanf("%d",&Case);
while(Case--)
{
scanf("%d %d %d",&n,&m,&K);
for(int i = ;i <= n;i++)
for(int j = ;j <= m;j++)
scanf("%d",&s[i][j]);
init();
for(int i = ;i <= n;i++)
for(int j = ;j <= m;j++)
for(int k = ;k <= K;k++)
for(int l = ;l <= K;l++)
{
for(int t = ;t <= min(K - l,m - j);t++)
f[i + ][j][k][l + t] = max(f[i + ][j][k][l + t],f[i][j][k][l] + s[i + ][j] + g[i][j][t]),
f[i + ][j][k + ][l + t] = max(f[i + ][j][k + ][l + t],f[i][j][k][l] + g[i][j][t]);
for(int t = ;t <= min(K - l,n - i);t++)
f[i][j + ][k][l + t] = max(f[i][j + ][k][l + t],f[i][j][k][l] + s[i][j + ] + h[i][j][t]),
f[i][j + ][k + ][l + t] = max(f[i][j + ][k + ][l + t],f[i][j][k][l] + h[i][j][t]);
}
int ans = ;
for(int i = ;i <= K;i++)ans = max(ans,f[n][m][i][i]);
printf("%d\n",ans);
}
}

[Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)的更多相关文章

  1. BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP

    BZOJ5359_[Lydsy1805月赛]寻宝游戏_DP Description begin.lydsy.com/JudgeOnline/upload/201805.pdf 我们需要找到一条权值最大 ...

  2. BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)

    4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 359  Solved: 205[Submit][Stat ...

  3. [BZOJ3991][SDOI2015]寻宝游戏

    [BZOJ3991][SDOI2015]寻宝游戏 试题描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择 ...

  4. 【BZOJ】【3991】【SDOI2015】寻宝游戏

    dfs序 我哭啊……这题在考试的时候(我不是山东的,CH大法吼)没想出来……只写了50分的暴力QAQ 而且苦逼的写的比正解还长……我骗点分容易吗QAQ 骗分做法: 1.$n,m\leq 1000$: ...

  5. 树形结构的维护:BZOJ 3991: [SDOI2015]寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...

  6. bzoj 3991: [SDOI2015]寻宝游戏

    Description 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可 ...

  7. 【BZOJ3991】【SDOI2015】寻宝游戏

    Description ​ 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然 ...

  8. Loj #2494. 「AHOI / HNOI2018」寻宝游戏

    Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...

  9. 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)

    [BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...

随机推荐

  1. Mac远程访问Ubuntu

    MacOS和Ubuntu连接到同一个网络使用ping命令可以通信即可.SSH使用SSH可以很方便的在MacOS上访问Ubuntu,不过只能用命令行操作,相当于连接了Ubuntu的终端. 1. Ubun ...

  2. GoF23种设计模式之结构型模式之装饰模式

    一.概述 动态地给一个对象添加一些额外的职责.装饰模式比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给但个对象添加职责. 2.处理那些可以撤销的职责. 3.当不能采 ...

  3. drf 视图功能

    视图 drf提供的视图功能 自己的第一次封装 #一个功能写成一个类,方便组合,只要继承它就可以有这个功能 #将功能都写在一个类中,可控性就会变差 from book.myserializers imp ...

  4. hdu 5984

    PockyTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissio ...

  5. jenkins匿名用户登录 - 安全设置

    最近自己安装配置jenkins,但是跑任务时,发现是匿名账户登录,且提示: 后来发现搭建好jenkins之后,默认就是匿名用户登录的,可以在安装设置菜单里进行账户管理. 1.登录Jenkins服务器, ...

  6. C语言高效编程的几招,你会了几招了?

    编写高效简洁的C 语言代码,是许多软件工程师追求的目标.本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教. 第1 招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个 ...

  7. Stringsobits(模拟)

    描述 Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits, of course, are either ...

  8. POJ 2353 Ministry

    Ministry Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4220   Accepted: 1348   Specia ...

  9. 简单使用EL进行标签的替换

    package com.ceshi; public class HtmlShow { public static String transfer(String txt,String cssClass) ...

  10. oracle列转行 WM_CONCAT LISTAGG

    开发给个SQL说给某个条件时报ORA-22922 代码段: SELECT 袋号, SUM(实际重量) AS 实际重量, SUM(材积重量) AS 材积重量, COUNT(运单号) AS 件数, TO_ ...