http://codeforces.com/gym/101257/problem/C

询问从左上角走到右下角,每次只能向右或者向左,捡起三种物品算作一个logo,求最多能得到多少个logo。

设dp[i][j][k][h]表示走到(i, j)这个格子,然后得到的第一种物品是k,第二种物品是h的时候,能得到的第三个物品的最大值是多少。

-inf表示不存在这个状态,其实第三种物品可以算出来,因为一共的步数就是i + j - 1,所以捡起的物品数量是固定的。

所以直接这样dp下去即可,是一个背包问题。

然后会MLE,所以我把第一维滚动了。(不会把第二维也滚动,一直出不了样例)

有一个小bug就是,每种物品最多都是可以捡200个,n + m - 1个,一定要都枚举是否成立。

一开始我只枚举到67个,因为67 * 3 = 201,logo数目其实最多就是66

但是会wa。还想不到数据

可能dp应该是要遍历所有可能的结果,只不过是选最优,有一些部分被抛弃了而已。

所以枚举到200吧,毕竟它最多能捡起200个。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 1e2 + ;
char str[maxn][maxn];
int n, m;
int dp[][maxn][ + ][ + ];
int pre(int id) {
if (id == ) return ;
else return id - ;
}
void work() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i) {
scanf("%s", str[i] + );
}
memset(dp, -0x3f, sizeof dp);
dp[][][][] = ;
dp[][][][] = ;
for (int i = ; i <= n; ++i) {
for (int j = ; j <= m; ++j) {
int en = i + j - ;
for (int k = en; k >= ; --k) {
for (int h = en; h >= ; --h) {
dp[i % ][j][k][h] = -inf;
if (str[i][j] == '>') {
if (k < ) {
dp[i % ][j][k][h] = -inf;
continue;
}
dp[i % ][j][k][h] = dp[pre(i % )][j][k - ][h];
dp[i % ][j][k][h] = max(dp[i % ][j][k][h], dp[i % ][j - ][k - ][h]);
} else if (str[i][j] == '|') {
if (h < ) {
dp[i % ][j][k][h] = -inf;
continue;
}
dp[i % ][j][k][h] = dp[pre(i % )][j][k][h - ];
dp[i % ][j][k][h] = max(dp[i % ][j][k][h], dp[i % ][j - ][k][h - ]);
} else {
dp[i % ][j][k][h] = dp[pre(i % )][j][k][h] + ;
dp[i % ][j][k][h] = max(dp[i % ][j][k][h], dp[i % ][j - ][k][h] + );
}
}
}
}
}
int ans = ;
for (int i = ; i <= ; ++i) {
for (int j = ; j <= ; ++j) {
ans = max(ans, min(i, min(j, dp[n % ][m][i][j])));
// if (dp[n % 3][m][i][j] >= 0) {
// cout << i << " " << j << " " << dp[n % 3][m][i][j] << endl;
// }
}
}
cout << ans << endl; } int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

C. Arcade dp二维费用背包 + 滚动数组 玄学的更多相关文章

  1. HDU 2159 FATE (DP 二维费用背包)

    题目链接 题意 : 中文题不详述. 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] = max(dp[i][h],dp[i ...

  2. Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. 榨取kkksc03 luogu1855 dp 裸二维费用背包

    首先对于这个题目背景,,个人认为很(you)好(qu),,, 核心就是一个裸的二维费用背包,刚刚学习的同学参见dd大牛的背包九讲 #include <cstdio> #include &l ...

  4. hdu2159二维费用背包

    题目连接 背包九讲----二维费用背包 问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物 ...

  5. 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...

  6. codevs1959拔河比赛(二维费用背包)

    1959 拔河比赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人 ...

  7. 洛谷 P1509 找啊找啊找GF(复习二维费用背包)

    传送门 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sq ...

  8. hdu_2159(二维费用背包)

    HDU_2159 二维费用背包问题 http://acm.hdu.edu.cn/showproblem.php?pid=2159 #include<cstdio> #include< ...

  9. HDU 2159 FATE(二维费用背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

随机推荐

  1. C# delegate Action<T> lambda表达式

    转载以记录:http://blog.csdn.net/educast/article/details/7219854 在使用 Action<T> 委托时,不必显式定义一个封装只有一个参数的 ...

  2. td 中连续数字或连续英文内容不自动换行

    原因: 把连续的英文当做成了一个单词. 解决: 加上 : word-break: break-all (允许单词内换行)

  3. POJ3660 Cow Contest —— Floyd 传递闭包

    题目链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  4. [置顶] SQL Server 2005 双机热备的实现

    [置顶] SQL Server 2005 双机热备的实现 分类: SQLSERVER2011-08-24 21:25 901人阅读 评论(0) 收藏 举报 sql servermicrosoftsql ...

  5. 书写优雅的shell脚本(五)- shell中(())双括号运算符

    在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构 ...

  6. python中的异常处理try/except/finally/raise

    异常发生在程序执行的过程中,如果python无法正常处理程序就会发生异常,导致整个程序终止执行,python中使用try/except语句可以捕获异常. try/except 异常的种类有很多,在不确 ...

  7. Superprime Rib

    链接 分析:满足题目条件的必然是1,2,3,5,7,9这几个数字的组合,DFS按位进行即可,边组合边判断是否合法. /* PROB:sprime ID:wanghan LANG:C++ */ #inc ...

  8. [USACO2006 DEC] Wormholes

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1715 [算法] 用SPFA判定负环是否存在即可 时间复杂度 : O(N ^ 2) [ ...

  9. 【NOIP2016】 组合数问题

    [题目链接] 点击打开链接 [算法] 杨辉三角 + 二维前缀和 O(1)计算答案 [代码] #include<bits/stdc++.h> using namespace std; #de ...

  10. Laravel 在 Nginx 中的参考配置两份

    此份参考自网络: server { listen 80; server_name laravel.app; root /项目目录/public; index index.php index.html ...