UVALive 4212 - Candy
Little Charlie is a nice boy addicted to candies. He is even a subscriber to All Candies Magazine and was selected to participate in the International Candy Picking Contest.
In this contest a random number of boxes containing candies are disposed in M rows with N columns each (so, there are a total of M × N boxes). Each box has a number indicating how many candies it contains.
The contestant can pick a box (any one) and get all the candies it contains. But there is a catch (there is always a catch): when choosing a box, all the boxes from the rows immediately above and immediately below are emptied, as well as the box to the left and the box to the right of the chosen box. The contestant continues to pick a box until there are no candies left.
The figure bellow illustrates this, step by step. Each cell represents one box and the number of candies it contains. At each step, the chosen box is circled and the shaded cells represent the boxes that will be emptied. After eight steps the game is over and Charlie picked 10+9+8+3+7+6+10+1 = 54 candies.

For small values of M and N, Charlie can easily find the maximum number of candies he can pick, but when the numbers are really large he gets completely lost. Can you help Charlie maximize the number of candies he can pick?
Input
The input contains several test cases. The first line of a test case contains two positive integers M and N (1 ≤ M×N ≤ 105 ), separated by a single space, indicating the number of rows and columns respectively. Each of the following M lines contains N integers separated by single spaces, each representing the initial number of candies in the corresponding box. Each box will have initially at least 1 and at most 103 candies. The end of input is indicated by a line containing two zeroes separated by a single space
Output
For each test case in the input, your program must print a single line, containing a single value, the integer indicating the maximum number of candies that Charlie can pick
Sample Input
5 5
1 8 2 1 9
1 7 3 5 2
1 2 10 3 10
8 4 7 9 1
7 1 3 1 6
Sample Output
54
水dp
一开始觉得n m的范围很大,仔细一看才知道n*m<=100000。。。。
我们可以每一行进行一次dp得到这一行的最大值 构造数组 a 然后对a数组在进行一次dp.
横着dp和竖着dp的状态转移是一样的 dp[i]=max(dp[i-1],dp[i-2]+a[i]) 即前i个数能得到的最大值
/* ***********************************************
Author :guanjun
Created Time :2016/10/7 12:08:19
File Name :la4212.cpp
************************************************ */
#include <bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 10010
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << ;
const double eps=1e-;
using namespace std;
priority_queue<int,vector<int>,greater<int> >pq;
struct Node{
int x,y;
};
struct cmp{
bool operator()(Node a,Node b){
if(a.x==b.x) return a.y> b.y;
return a.x>b.x;
}
}; bool cmp(int a,int b){
return a>b;
}
vector<int>v[];
int dp[];
int a[];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int n,m,x;
while(cin>>n>>m){
if(n==&&m==)break;
for(int i=;i<=n;i++){
v[i].clear();
for(int j=;j<=m;j++){
scanf("%d",&x);
v[i].push_back(x);
}
}
//先横着dp 再竖着dp
cle(a);
for(int i=;i<=n;i++){
m=v[i].size();
cle(dp);
for(int j=;j<m;j++){
if(j<)dp[j]=max(dp[j-],v[i][j]);
else dp[j]=max(dp[j-]+v[i][j],dp[j-]);
}
//cout<<"hang "<<dp[m-1]<<endl;
a[i]=dp[m-];
}
//for(int i=1;i<=n;i++)cout<<a[i]<<endl;
cle(dp);
for(int i=;i<=n;i++){
if(i<=)dp[i]=max(dp[i-],a[i]);
else dp[i]=max(dp[i-]+a[i],dp[i-]);
}
if(n==)cout<<max(dp[],dp[])<<endl;
else cout<<dp[n]<<endl;
}
return ;
}
更新:2018.6.15
/* ***********************************************
Author :guanjunace@foxmail.com
Created Time :2018年06月15日 星期五 09时59分17秒
File Name :131.cpp
************************************************ */
#include <iostream>
#include <vector>
using namespace std; int solve(vector<int>& a) {
int len = a.size();
vector<int> dp(len, );
dp[] = a[];
for (int i = ; i < len; ++i) {
if (i >= ) dp[i] = max(dp[i-] + a[i], dp[i-]);
else dp[i] = max(a[i-], a[i]);
//cout << dp[i] << "-" << endl;
}
return dp[len - ];
} int main() {
int n, m, x;
while (cin >> n >> m && n && m) {
vector<int> v;
for (int i = ; i < n; ++i) {
vector<int> a;
for (int j = ; j < m; ++j) {
cin >> x;
a.push_back(x);
}
//cout << solve(a) << endl;
v.push_back(solve(a));
}
cout << solve(v) << endl;
}
return ;
}
UVALive 4212 - Candy的更多相关文章
- UVALive 5791 Candy's Candy 解题报告
比赛总结 题目 题意: 有f种口味的糖果,现在要把每颗糖果分到一些packs里面去.packs分两种: flavored pack:只有一种口味. variety pack:每种口味都有. 求满足下列 ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
- [LeetCode] Candy 分糖果问题
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
- UVALive - 3942 Remember the Word[树状数组]
UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...
- Leetcode Candy
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- LeetCode 135 Candy(贪心算法)
135. Candy There are N children standing in a line. Each child is assigned a rating value. You are g ...
- [LeetCode][Java]Candy@LeetCode
Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- 【leetcode】Candy(hard) 自己做出来了 但别人的更好
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
随机推荐
- jstree的基本应用----记录
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- ZOJ - 3983 - Crusaders Quest(思维 + 暴力)
题意: 给出一个字符串,长度为9,包含三种各三个字母"a","g","o",如果一次消除连续三个一样的分数+1,消完自动向左补齐 其中可以消 ...
- 爬虫之pyquery库
官方文档:https://pyquery.readthedocs.io/en/latest/ PyQuery是一个强大又灵活的网页解析库.如果你觉得正则写起来太麻烦.BeautifulSoup语法太难 ...
- Jmeter使用基础笔记-认识Jmeter
我在工作过程中接触Jmeter不算特别多,对Jmeter的使用也只是限于基础阶段,不过对付基本的一些需求我想足够使用了.有好几个朋友问我关于Jmeter的问题,在此我将我在工作过程中的使用心得和总结的 ...
- Codeforces 990D - Graph And Its Complement
传送门:http://codeforces.com/contest/990/problem/D 这是一个构造问题. 构造一张n阶简单无向图G,使得其连通分支个数为a,且其补图的连通分支个数为b. 对于 ...
- MySQL 分库、分表
Mysql Sharding 前言 1)Sharding是按照一定规则重新分布数据的方式 2)解决单机写入压力过大和容量问题 3) 解决单机查询慢的问题 4)本文主要根据用户登录场景分析 Shard ...
- Springboot源码分析
参考资料 https://www.cnblogs.com/lizongshen/p/9127999.html
- lombok 插件安装
1. 下载地址: https://plugins.jetbrains.com/plugin/6317-lombok-plugin 2. 选择从本地安装.
- Eclipse中使用JRebel实现项目热部署(Maven插件版)
JRebel实现项目热部署(Maven插件版) 热部署,就是在应用运行过程中不进行重启,可直接进行软件升级. 在开发过程中,热部署就是在项目运行过程中变更代码,无需重启服务器即可使代码生效. tomc ...
- JavaSE 学习笔记之新特性之泛型(二十)
泛型:jdk1.5版本以后出现的一个安全机制.表现格式:< > 好处: 1:将运行时期的问题ClassCastException问题转换成了编译失败,体现在编译时期,程序员就可以解决问题. ...