160 条题解
-
0naneux LV 8 @ 2009-11-02 12:50:07
世界上最痛苦的事情就是水题A不了
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
我太傻B了 -
02009-11-01 20:27:54@
好恶心的题……
搞了我好久
有罪……祈祷一下
————————————
动规:经典的石子合并再改动。用a[i]记录每个珠子的属性。
两种方法:
1.f表示从i到j合并的最大值。转移为f:=f+f[k+1,j]+a*a[k,2]*a[j,2]。 注意k可以比i小,j可以比k小,表示圈循环。输出max{f[i,(i+n-2) mod n+1}。
2.f表示从i开始j个合并的最大值。转移为f:=f+f[(i+k-1) mod n+1,j-k]+a*a[(i+k-1) mod n+1,1]*a[(i+k-2) mod n+1,2]。输出max{f}。错误做法
两种动规都有错误的写法(上下对应)。
1.没有注意圈的循环。没有把k放在外层循环。(得分将会扣掉90。)
2.没有把j放在外层循环。(得分将会扣掉50)。 -
02009-10-30 22:06:05@
谁能帮我解释一下这里的
for i:=1 to n do
for j:=1 to n+n-i do
for k:=j to i+j-1 do
if b[j,i+j] -
02009-10-29 19:58:44@
F表示从第i个数到第j个数合并起来的最小值
F:=MIN(F+F[k+1,j])+sum (i -
02009-10-24 19:51:28@
program v1;
var n,v,i,k,j,l,max1:longint;
a:array[1..250]of longint;
f:array[1..250,1..250]of longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);fillchar(f,sizeof(f),0);
for i:=1 to n do a[n+i]:=a[i];
for i:=1 to 2*n do f:=a[i]*a*a;
for l:=2 to n-1 do
for i:=1 to 2*n do
begin
j:=i+l;for k:=i to j-1 do f:=max(f+f[k+1,j]+a[i]*a[k+1]*a[j+1],f);
end;
max1:=0;for i:=1 to n do begin j:=i+n-1;max1:=max(f,max1);end;writeln(max1);
readln;
readln
end.
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms秒杀;就是要用2倍数组,2倍搜索;
-
02009-10-14 17:27:53@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 25ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:25msvar a,b:array[0..1000]of longint;
i,t,n,j,k,max1:longint;
f:array[0..103,0..103]of longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
begin
readln(n);
max1:=0;
for i:=1 to n do read(a[i]);
a[0]:=a[n];
for t:=1 to n do
begin
fillchar(b,sizeof(b),0);
fillchar(f,sizeof(f),0);
for i:=1 to n do b[i]:=a[(i+t-1) mod n];
b[0]:=b[n];
for i:=n downto 1 do
for j:=i+1 to n do
for k:=i to j-1 do
f:=max(f,f+f[k+1,j]+b[i]*b[(j+1) mod n]*b[(k+1) mod n]);
if f[1,n]>max1 then max1:=f[1,n];
end;
writeln(max1);
end.PUPPY神机!N四方算法差点秒杀
-
02009-10-12 22:49:59@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms倍长,,倍长,,就是倍长嘛..
-
02009-10-07 12:57:21@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms将n个数扩展成一个长度为2n的链状,然后做n次dp,而且是for i=n downto 1 do;复杂度理论上是O(n^3),但是用了记忆化之后,其实是远小于O(n^3)的,但是肯定大于O(n^2);
-
02009-09-30 21:06:17@
石子归并
-
02009-09-26 11:24:41@
100题纪念......
-
02009-09-18 16:56:03@
多少年了,我总算AC了...
DP就是要注意+1,-1的问题,-1了以后就AC了... -
02009-09-06 20:46:55@
dp的转移方程是:
Best=maxQ[1,n] 1 -
02009-08-27 14:20:28@
交了N次 都是10分
无奈 准备放弃
又交了一次
AC...
耍我啊!!!!!vijos -
02009-08-25 20:40:03@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-08-24 22:36:22@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-#include"stdio.h"
typedef struct
{ long x,y;
long w;
}node;
int main()
{ long i,j,k,m=0,n,h=0;
node max[101][101],data[101][101];
long a[101];
memset(max,0,sizeof(max));
memset(data,0,sizeof(data));
scanf("%ld",&n);
for(i=1;i -
02009-08-19 14:09:34@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar
f:array[1..253,1..253] of longint;
a,b:array[1..203] of longint;
n,i,j,k,p:longint;
max:longint;
begin
readln(n);
for i:=1 to n do begin
read(a[i]);
a[n+i]:=a[i];
end;
for i:=1 to n-1 do begin
b[i]:=a;
b:=b[i];
end;
b[n]:=a[1];
b[2*n]:=b[n];
fillchar(f,sizeof(f),0);
for p:=1 to n-1 do
for i:=1 to 2*n-2 do begin
j:=i+p;
if j>2*n-1 then break;
for k:=i to j-1 do begin
max:=f+f[k+1,j]+a[i]*b[k]*b[j];
if ff then f:=max;
end;
max:=0;
for i:=1 to n do if f>max then max:=f;
writeln(max);
end.“石子合并”问题,十分经典
-
02009-08-18 15:30:41@
计算的时候忘了 mod n,WA 了3次。唉。。。。。。。。!
-
02009-08-15 22:09:55@
好难,谁有更简洁的方法
-
02009-08-14 11:03:42@
var
n:integer;
a:array[1..250] of integer;
i,j,k:integer;
b:array[1..250,1..250] of int64;
max:qword;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
a[n+i]:=a[i];
end;
for i:=1 to n do
for j:=1 to n+n-i do
for k:=j to i+j-1 do
if b[j,i+j] -
02009-08-12 16:57:12@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
同志们注意啊!数据范围有误!
数组开200不行
要用250!
血的教训啊!