【HDOJ】4374 One hundred layer
线性DP,使用单调队列优化。
/* 4374 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int INF = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
int n, m, x, t;
int score[maxn][maxm];
int dp[maxn][maxm];
int P[maxm], Q[maxm];
int sum[maxm]; void solve() {
int i, j, k;
int lpos, rpos;
int l, r, tmp; for (i=; i<=n; ++i)
for (j=; j<=m; ++j)
dp[i][j] = -INF; for (j=; j<=m; ++j)
sum[j] = sum[j-] + score[][j];
for (lpos=max(,x-t),j=lpos; j<=x; ++j)
dp[][j] = sum[x] - sum[j-];
for (rpos=min(m,x+t),j=rpos; j>x; --j)
dp[][j] = sum[j] - sum[x-]; for (i=; i<=n; ++i) {
for (j=; j<=m; ++j)
sum[j] = sum[j-] + score[i][j]; // k <= j
l = , r =;
for (j=; j<=m; ++j) {
lpos = max(, j-t);
tmp = dp[i-][j] - sum[j-];
while (l<=r && Q[r]<=tmp)
--r;
Q[++r] = tmp;
P[r] = j;
while (P[l] < lpos)
++l;
dp[i][j] = max(dp[i][j], Q[l] + sum[j]);
} // k>=j
l = , r =;
for (j=m; j>=; --j) {
rpos = min(m, j+t);
tmp = dp[i-][j] + sum[j];
while (l<=r && Q[r]<=tmp)
--r;
Q[++r] = tmp;
P[r] = j;
while (P[l] > rpos)
++l;
dp[i][j] = max(dp[i][j], Q[l] - sum[j-]);
}
} int ans = -INF; rep(j, , m+)
ans = max(ans, dp[n][j]); printf("%d\n", ans);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif while (scanf("%d %d %d %d", &n, &m, &x, &t)!=EOF) {
rep(i, , n+)
rep(j, , m+)
scanf("%d", &score[i][j]);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
数据发生器。
from copy import deepcopy
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 10
bound = 10**5
# fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(1, 100)
m = randint(1, 10000)
x = randint(1, m)
t = randint(1, m)
fout.write("%d %d %d %d\n" % (n, m, x, t))
for i in xrange(n):
L = []
for j in xrange(m):
x = randint(-500, 500)
L.append(x)
fout.write(" ".join(map(str, L)) + "\n") def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()
【HDOJ】4374 One hundred layer的更多相关文章
- HDU 4374 One hundred layer DP的单调队列优化
One hundred layer Problem Description Now there is a game called the new man down 100th floor. The ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【前端】使用layui、layer父子frame传值
前提: 半前后台分离,前后台都是使用JSON格式的数据进行交互.[化外音,这里我说半分离,是因为使用了themleaf模板进行路由.] 业务说明: 前端通用的逻辑是:列表展示数据,点击事件弹出fram ...
- 【HDOJ】4601 Letter Tree
挺有意思的一道题,思路肯定是将图转化为Trie树,这样可以求得字典序.然后,按照trie的层次求解.一直wa的原因在于将树转化为线性数据结构时要从原树遍历,从trie遍历就会wa.不同结点可能映射为t ...
- web 前端常用组件【07】弹出层 Layer
web 项目中总是需要弹出框,来让用户进行下一步的操作. 大到弹出另外一个页面,小到弹出提示.确认等. 经手几个项目,还是感觉 Layer 用起来比较的轻松,你能想到的 Layer 都能帮你做到. 感 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
随机推荐
- excel 导入功能
一:示例代码 //InputStream fis = new FileInputStream(tomcaturl+this.awardTask.getFileRoute());//可以通过上述方式获得 ...
- JavaScript jQuery 入门回顾
$符号 $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名: window.jQuery; // j ...
- XML节点处理
XmlDocument xmlDoc = new XmlDocument(); if (!File.Exists(xmlFileName)) { return string.Empty; } xmlD ...
- 如何建立一个“绑定友好的”usercontrol--wpf
如何建立一个"绑定友好的"usercontrol--wpf 这几天在打算将以前用winform写的工具程序重构到wpf,顺便学习理解看过的wpf的知识. 因为程序设计到一个Exce ...
- CSS控制 table 的 cellpadding,cellspacing
CSS 常规解决办法: 表格的 cellpadding 和 cellspacing 我们经常会用如下的方式来清除默认样式: <table cellspacing="0" ce ...
- CentOS-6.5安装配置JDK-7|Tomcat-8
安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...
- V9自定义分页函数
大家做网站的时候,可能很多时候分页样式都得根据模板的要求来控制的,这时很多人都会去修改全局文件phpcms\libs\functions \global.func.php里的pages()函数,这样问 ...
- ligerGrid 取得选中行的数据
var SelectUserIdArr = []; function GetData() { var returnValue = ""; var grid = $("#m ...
- C# 将Datatable作为参数,传入存储过程
//创建一个静态方法 public static DataSet fnInsertSingleUser(DataTable v_dt, params string[] param) { try { S ...
- 【BZOJ 2301】[HAOI2011]Problem b
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...