35 条题解
-
2Spectre LV 10 @ 2017-11-09 11:42:31
zhangyq987 Orz
ml[i]表示从i位置往左走再回到i位置可获得的最大满足度;
mr[i]表示从i位置往右走再回到i位置可获得的最大满足度;C++代码
#include<iostream> using namespace std; #define INF 10000000 #define MAXN 1005 int n,l,r; int d[MAXN],f[MAXN],c[MAXN]; int ml[MAXN],mr[MAXN],sum[MAXN]; void init() { cin >>n>>l>>r; for(int i=1;i<=n;i++) cin >>d[i]; for(int i=1;i<=n;i++) cin >>f[i]; sum[0]=0; for(int i=1;i<=n;i++) cin >>c[i],sum[i]=sum[i-1]+c[i]; ml[0]=0;ml[n+1]=0; mr[0]=0;mr[n+1]=0; for(int i=1;i<=n;i++) ml[i]=max(ml[i-1]-l-r,0)+c[i]; for(int i=n;i>=1;i--) mr[i]=max(mr[i+1]-l-r,0)+c[i]; } int main() { ios::sync_with_stdio(0); init(); int ans=-INF,t; for(int i=1;i<=n;i++)//in { for(int j=1;j<=n;j++)//out { if(i<j) t=ml[i]+mr[j]+sum[j-1]-sum[i]-r*(j-i)-d[i]-f[j]; else if(i>j) t=mr[i]+ml[j]+sum[i-1]-sum[j]-l*(i-j)-d[i]-f[j]; else t=c[i]-d[i]-f[j]; ans=max(t,ans); } } cout <<ans<<endl; return 0; }
-
22009-08-23 23:03:54@
var
d,c,f,ll,rr:packed array[0..1000]of longint;
s:packed array[0..1000]of int64;
n,l,r,i,j,max,k,t,p,last:longint;
begin
readln(n,l,r);max:=-maxlongint;
for i:=1 to n do read(d[i]);readln;
for i:=1 to n do read(f[i]);readln;
for i:=1 to n do begin read(c[i]);s[i]:=s+c[i];end;
for i:=1 to n do
begin
last:=0;
for j:=i-1 downto 1 do begin
p:=last+c[j]-l-r;
if p>ll[i] then ll[i]:=p;
last:=p;
end;
last:=0;if ll[i]rr[i] then rr[i]:=p;
last:=p;
end;
if rr[i]max then max:=k;
end;
end;
write(max);
end.
添加两个预处理数组ll,rr就可以秒杀
ll[i]表示从i位置往左走再回到[i]位置可获得的最大满足度;
rr[i]表示从i位置往右走再回到[i]位置可获得的最大满足度;
有处理完枚举就可以秒杀!
-_- -
22009-08-23 23:01:38@
dp,秒杀!
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms核心部分:for i:=2 to n do begin
fillchar(f2,sizeof(f2),0);
f2[1]:=f1[6];
f2[2]:=max(f1[2],f1[3],f1[4],f1[5],-maxlongint)-r-l+c[i];
f2[3]:=max(f1[3],f1[5],-maxlongint,-maxlongint,-maxlongint)+d+c[i]-d[i]-l;
f2[4]:=max(f1[4],f1[5],-maxlongint,-maxlongint,-maxlongint)+c[i]+a-r-a[i];
f2[5]:=max(c[i]-d[i]-a[i],f1[5]+d+c[i]-d[i]-l+a-a[i]-r,-maxlongint,-maxlongint,-maxlongint);
f2[6]:=max(f2[1],f2[2],f2[3],f2[4],f2[5]);
f1:=f2;
end;
初始化:f1[1]:=-maxlongint;
f1[2]:=-maxlongint;
f1[3]:=-maxlongint;
f1[4]:=-maxlongint;
f1[5]:=c[1]-d[1]-a[1];
f1[6]:=max(f1[1],f1[2],f1[3],f1[4],f1[5]);
O(n)级算法 -
12014-07-16 19:15:05@
艹艹艹艹艹艹艹艹艹艹艹艹艹艹!!!!还有负数答案!!!
-
02009-11-09 11:53:03@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms万恶的预处理...这题我拖了N长时间...
记得上次wa了一半.................
为啥今天心血来潮叫上去就秒杀呢.....PS:天啊~的日文版是
-
02009-11-08 21:24:26@
此题果断枚举 秒杀!!
要先预处理从第i个点向左和向右的最大满意度
再枚举入口和出口 -
02009-10-28 21:52:56@
也许我头脑简单吧,,不过题意我真的没有搞清。。
1.同lx游历怎么说的像都要走。。
2.为什么不能进出多次。。。。。 -
02009-10-24 13:53:57@
题目说游历,我还以为每个格子都要走一遍。
第二点过不了,Orz -
02009-10-14 11:57:36@
各种秒杀果断不解释。
-
02009-11-08 09:37:53@
囧,225个
考试是怎么是零分呢?~
还有我觉得我是暴搜的~ -
02009-09-16 20:49:26@
Accepted 有效得分:100 有效耗时:0ms
没注意,被那个负解阴到了两遍........
方程很简单:
满足i -
02009-09-12 11:22:02@
初始化后o(n^2)秒杀
-
02009-09-11 19:09:17@
好难理解的题意
-
02009-09-01 22:05:12@
什么是“我整个人都hello kitty了?”
-
02009-09-01 21:33:56@
silverlows的算法好奇怪哦
O(n^2)还是比较好想的。。
本菜突发奇想出一个O(n)算法,但是语文太差,表述不清。 -
02009-09-09 19:10:59@
令f(i,j,k)表示从i开始,是从右边过来还是从左边过来,需要不需要返回时的最大值。
然后枚举起点,考虑如何走即可。注意走完左边回到原点时,不可能再走左边,右边同理。
另外一定要走至少一个点。
O(n) -
02009-08-30 10:49:13@
测试数据 01:答案正确... 0ms
├ 测试数据 02:答案错误...程序输出比正确答案长
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
为什么啊 第二个点怎么回事啊 -
02009-08-29 16:38:17@
srO silverlows Orz,O(N)算法果然天下无敌,让我受益匪浅
-
02009-08-26 22:06:31@
Orz zhangyq987,让我茅塞顿开.
再次Orz -
02009-08-25 23:10:44@
妹妹你坐船头哦哦哦,哥哥我在岸上走哦哦哦~
囧题