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的更多相关文章

  1. UVALive 5791 Candy's Candy 解题报告

    比赛总结 题目 题意: 有f种口味的糖果,现在要把每颗糖果分到一些packs里面去.packs分两种: flavored pack:只有一种口味. variety pack:每种口味都有. 求满足下列 ...

  2. UVALive - 3942 Remember the Word[Trie DP]

    UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...

  3. [LeetCode] Candy 分糖果问题

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  4. UVALive - 4108 SKYLINE[线段树]

    UVALive - 4108 SKYLINE Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug ...

  5. UVALive - 3942 Remember the Word[树状数组]

    UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...

  6. Leetcode Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  7. LeetCode 135 Candy(贪心算法)

    135. Candy There are N children standing in a line. Each child is assigned a rating value. You are g ...

  8. [LeetCode][Java]Candy@LeetCode

    Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  9. 【leetcode】Candy(hard) 自己做出来了 但别人的更好

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

随机推荐

  1. 【sqli-labs】 对于less34 less36的宽字节注入的一点深入

    1.AddSlashes() 首先来观察一下是如何通过构造吃掉转义字符的 先将less 34的网页编码换成gbk 加上一些输出 echo "Before addslashes(): &quo ...

  2. Java_大数值_16.5.12

    如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的BigInteger和BigDecimal这两个类.这两个类可以处理包含任意长度数字序列的数值.BigInteger类实现了 ...

  3. 易忘小技巧--yum

    写在前面:日常维护系统中,如果不是天天接触,难免会忘记一些实用小技巧,本文记录自己使用的小技巧,有新发现时,会长期更新 安装epel和dnf源 # 安装epel yum -y install epel ...

  4. php第三十节课

    文件操作 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  5. 更改Visual Studio Code为中文字体最有效的方法

    更改Visual Studio Code为中文字体最有效的方法. 网址:  https://marketplace.visualstudio.com/search?target=VSCode& ...

  6. zabbix登录密码重置方法

    注:由于账号较多,难免忘记账号,下面是找回zabbix登录密码的过程. 一.登录zabbix数据库 [root@123 ~]# mysql -uroot -p密码 二.修改zabbix密码 mysql ...

  7. 51NOD 1287 加农炮(不水的线段树)

    >>点击进入原题测试<< Input示例 Output示例 思路:刚开始以为结点存最大值就行了,然后大于左子树的最大值就能进入右子树:然后发现样例都过不了:后面发现,并不是这个 ...

  8. 使用 XMLHttpRequest实现Ajax

    [XMLHttpRequest的概述] 1.XMLHttpRequest最早是在IE5中以ActiveX组件的形式实现的.非W3C标准 2.创建XMLHttpRequest对象(由于非标准所以实现方法 ...

  9. 个人常用git命令

    最近开始使用git,将自己常用git命令做一个简单归纳,便于记忆. 初始化及配置 git init:初始化资料库 git config --global user.name 'xxx':配置用户名 g ...

  10. 作DJANGO ORM时的一些最佳实践

    还是国外的正规,都在作DJANGO ORM的解藕化工作了. 外键不用,多对多,一对多,不用. 参考URL: http://scottlobdell.me/2015/01/sql-database-be ...