175 条题解
-
0king465659 LV 8 @ 2009-06-12 15:01:25
AC:
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msprogram message;
var
m,n,i,j,k,p :longint;
num :array[1..60,1..60]of longint;
ans :array[1..60,1..60,1..60]of longint;
begin
readln(m,n);
for i:=1 to m do
for j:=1 to n do read(num);
fillchar(ans,sizeof(ans),255);
ans[2,1,2]:=num[2,1]+num[1,2];
for i:=2 to m do
for j:=1 to n do
for k:=j+1 to n do
begin
if i+j -
02009-05-30 01:35:59@
直接四维或者旋转45度压成三维
-
02009-05-21 17:30:57@
位运算做法
var
f :array[2..100,1..50,1..50]of longint;
g :array[1..50,1..50]of longint;
m,n,i,j,k,x1,x2,nx1,nx2,ny1,ny2:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;begin
read(m,n);
for i:=1 to m do
for j:=1 to n do
read(g[j,i]);
fillchar(f,sizeof(f),0);
f[2,1,2]:=g[1,2]+g[2,1];
for k:=3 to n+m-2 do
for x1:=1 to n-1 do
for x2:=x1+1 to n do
for j:=0 to 3 do
begin
nx1:=x1+j and 1;
nx2:=x2+j shr 1 and 1;
if (nx1>n)or(nx2>n)or(nx1=nx2) then continue;
ny1:=k+1-nx1;ny2:=k+1-nx2;
if (ny1m) then continue;
f[k,nx1,nx2]:=max(f[k,nx1,nx2],f[k-1,x1,x2]+g[nx1,ny1]+g[nx2,ny2]);
end;
writeln(f[m+n-2,n-1,n]);
end. -
02009-05-08 13:57:16@
#include
int f(int,int,int);
int map[100][100],m,n,num[110][60][60];
main()
{
scanf ("%d%d",&m,&n);
int i,j;
for (i=0;i -
02009-08-03 11:52:40@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms可用三维的动规,可惜当年考试时...唉
d[k,i,j]:=max(d[k-1,i-1,j-1],d[k-1,i-1,j],d[k-1,i,j-1],d[k-1,i,j])+a[x1,i]+a[x2,j]; -
02009-04-26 12:30:30@
这题蛮简单的,我是三重循环+三维数组的。.0MS秒杀,其实大家完全可以跳出这道题,当成两个人一起走这个矩阵.都是从左上角走到右下角,这样得出的结果也是一样的,并且只需要三重循环.
我用x表示阶段,我是来斜着划分阶段的,i和j表示两个人在这个阶段上的坐标.方程就可以列出来了.
if ij
then
t:=a+a[j,x-j+1]
else
t:=0; {因为这里是两个人都到了同一个点上,是不能传两次,所以设为0}
f[x,i,j]:=t+max(f[x-1,i-1,j],max(f[x-1,i-1,j-1],max(f[x-1,i,j-1],f[x-1,i,j])));
希望能对大家提供一些帮助! -
02009-04-22 17:11:10@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms我无语了,同样的思想,想法。考场上怎么就没做出来?!!
当时都是这么想的 = = , 结果....
2008 NOIP 我败得太可怜了! -
02009-04-11 21:44:56@
dp[i1][i2][j1][j2]=max(
dp[i1+1][i2+1][j1][j2],
dp[i1+1][i2][j1][j2+1],
dp[i1][i2+1][j1+1][j2],
dp[i1][i2][j1+1][j2+1])+p[i1][j1]+p[i2][j2]
用的是记忆搜索
以前记忆搜索判断是否存在值总是在dfs前判断,这回我全部改到dfs开头判断了~~代码量大大缩短。 -
02009-03-24 23:34:24@
program vijos1493;
var
m,n,i,j,i1,j1,p:longint;
a:array[1..50,1..50]of longint;
f:array[0..51,0..51,0..51,0..51]of integer;
function max(a,b,c,d:longint):longint;
begin
max:=a;
if b>max then max:=b;
if c>max then max:=c;
if d>max then max:=d;
end;
begin
readln(m,n);
for i:=1 to m do
begin
for j:=1 to n do read(a);
readln;
end;
fillchar(f,sizeof(f),0);
for i:=1 to m do
for j:=1 to n do
for i1:=1 to m do
for j1:=1 to n do
begin
p:=max(f,f,f,f);
if ((i=i1)and(j=j1)) then f:=p+a
else f:=p+a+a[i1,j1];
end;
writeln(f[m,n,m,n]);
end.
最好理解的4维 -
02009-03-19 14:15:31@
program chuanzhitiao;
var a:array[-1..50,-1..50] of integer;
f:array[0..500,-1..50,-1..50] of longint;
i,j,k,l,n,m:longint;function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
begin
readln(m,n);
for i:=0 to m-1 do
for j:=0 to n-1 do
read(a);
f[0,0,0]:=0;
for k:=1 to n+m-3 do
for i:=0 to n-2 do
if (i>k) then break
else
for j:=i+1 to n-1 do
if (ij) and (j=0) and (k-j>=0) then
begin
if (j-i)>1
then f[k,i,j]:=max(max(f[k-1,i-1,j-1],f[k-1,i-1,j])
,max(f[k-1,i,j-1],f[k-1,i,j]))+a[k-i,i]+a[k-j,j]
else
f[k,i,j]:=max(max(f[k-1,i-1,i],f[k-1,j-1,j]),f[k-1,i-1,j])+a[k-i,i]+a[k-j,j];
end;
end;
writeln(f[k,n-2,n-1]) ;
end.
打击我的积极性,写4维还过,3维秒杀,2维不想写了 -
02009-03-03 08:32:18@
program qu;
var data:array[1..50,1..50]of integer;
sum:array[0..50,0..50,0..50,0..50]of longint;
m,n,i,j,i1,j1,i2,j2:integer;
p:longint;
function max(a,b:longint):longint;
begin
if a>b then max:=a else max:=b;
end;
beginfillchar(data,sizeof(data),0);
fillchar(sum,sizeof(sum),0);
readln(m,n);
for i:=1 to m do
begin
for j:=1 to n do
read(data);
readln;
end;for i1:=1 to m do
for j1:=1 to n do
for i2:=1 to m do
for j2:=1 to n do
if ((j2j1)and(i1i2))or((i1=m)and(i2=m)and(j1=n)and(j2=n)) then begin
p:=max(sum[i1-1,j1,i2-1,j2],sum[i1-1,j1,i2,j2-1] );
p:=max(p,sum[i1,j1-1,i2-1,j2]);
p:=max(p,sum[i1,j1-1,i2,j2-1]);
sum[i1,j1,i2,j2]:=p+data[i1,j1]+data[i2,j2];
end;writeln(sum[m,n,m,n]);
end.
-
02009-02-20 17:29:52@
var i,j,m,n,k,p,l,d1,d2:longint;
x,y,xx,yy,x1,x2,y1,y2:longint;
a,f,f1:array[1..500,1..500] of longint;
b:array[1..500,1..500] of boolean;begin
readln(n,m);
fillchar(b,sizeof(b),false);
for i:=1 to n do
for j:=1 to m do
begin
read(a);
b:=true
end;
k:=n+m-1;
fillchar(f,sizeof(f),0);
for i:=2 to k do
begin
fillchar(f1,sizeof(f1),0);
for x1:=1 to i-1 do
for x2:=1 to i-1 do
begin
y1:=i-x1;
y2:=i-x2;
if b[x1,y1] and b[x2,y2] and((x1x2)or(i=2))then
for d1:=0 to 1 do
for d2:=0 to 1 do
begin
if d1=0 then begin x:=x1+1;y:=y1 end
else begin x:=x1;y:=y1+1 end;
if d2=0 then begin xx:=x2+1;yy:=y2 end
else begin xx:=x2;yy:=y2+1 end;
if ((xxx)or(i=k))and b[x,y] and b[xx,yy] then
if f[x1,x2]+a[x,y]+a[xx,yy]>f1[x,xx]
then begin f1[x,xx]:=f[x1,x2]+a[x,y]+a[xx,yy];end
end
end;
f:=f1
end;
writeln(f[n,n])
end.2维......
-
02009-02-19 17:17:56@
考试的时候做不出来郁闷的 啊 ~~~~~~~~~~~··
极度郁闷~ -
02009-02-14 22:37:10@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msprogram 1493
const
s:array[1..2,1..2] of integer=((0,-1),(-1,0))
varr
k,i1,i2,j1,j2,m,n,r,l,i,j,P:longint;
a:array[1..50,1..50] of longint;
d:array[3..100,1..50,1..50] of longint;
begin
readln(m,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(a);
end;
readln;
end;
d[3,1,2]:=a[1,2]+a[2,1];
for k:=4 to n+m do
begin
for i:=1 to n do
if (k-i>=1) and (k-i=1) and (k-i=1)and(j1+s[r,2]>=1)and(i2+s[l,1]>=1)and(j2+s[l,2]>=1)and(i1+s[r,1]i2+s[l,1])and
(d[k,i1,i2] -
02009-02-13 20:31:11@
最大费用流。
-
02009-02-04 20:40:35@
编译通过...
├ 测试数据 01:运行超时|无输出...
├ 测试数据 02:运行超时|无输出...
├ 测试数据 03:运行超时|无输出...
├ 测试数据 04:运行超时|无输出...
├ 测试数据 05:运行超时|无输出...
├ 测试数据 06:运行超时|无输出...
├ 测试数据 07:运行超时|无输出...
├ 测试数据 08:运行超时|无输出...
├ 测试数据 09:运行超时|无输出...
├ 测试数据 10:运行超时|无输出...
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:0 有效耗时:0ms囧~~~~~~~~~~~
-
02009-02-03 19:00:01@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-02-01 14:52:58@
囧……我考试的时候拼命提醒自己:这是多进程DP……这是多进程DP……这是多进程DP……问题就是忘记怎么实现了……
-
02009-11-07 19:07:47@
var
f : array[0..99,0..50,0..50]of longint;
a : array[1..99,1..50]of longint;
k,y,x,i,j,n,m,t : longint;
begin
for i:=1 to 99 do
for j:=1 to 50 do a:=-1;
readln(m,n);
for i:=1 to m do
begin
y:=i;x:=1;
for j:=1 to n do
begin
read(t);
a[y,x]:=t;
y:=y+1;
x:=x+1;
end;
end;
for i:=2 to m+n-2 do
for j:=1 to n do
if a-1 then
for k:=1 to n do
if (jk)and(a-1)and(k>j) then
begin
f:=a+a;
if f+a+a>f then f:=f+a+a;
if f+a+a>f then f:=f+a+a;
if f+a+a>f then f:=f+a+a;
if f+a+a>f then f:=f+a+a;
end;
writeln(f[m+n-2,n-1,n]);
end. -
02009-01-08 19:56:26@
自己的程序考试时AC
交道Vijos上 就WA了……
AC率……
Orz..................