153 条题解
-
0麟弦 LV 9 @ 2009-08-13 17:36:58
whyvine的解题报告:
http://blog.sina.com.cn/s/blog_618b6ea70100eglj.html
里面分析了为什么f是正确的而f是错误的 -
02009-08-12 11:59:46@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:答案正确... 0ms
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:答案正确... 0ms
├ 测试数据 19:答案正确... 0ms
├ 测试数据 20:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
倒着dp真的不用考虑中间最高的那个
var
f:array[0..1000,0..5000]of longint;
a:array[0..5000]of longint;
n,m:longint;
procedure init;
var
i:longint;
begin
readln(m,n);
for i:=1 to n do read(a[n-i+1]);
end;
procedure dp;
var
i,j:longint;
begin
for i:=1 to m do
for j:=1 to n do
if j>=i*3 then
begin
f[i][j]:=f[j-2]+sqr(a[j-1]-a[j]);
if j-1>=i*3 then
if f[i][j]>f[i][j-1] then f[i][j]:=f[i][j-1];
end;
writeln(f[m][n]);
end;
begin
init;
dp;
end.但是,还是看了题解才会做。。。
-
02009-08-10 15:56:53@
PROGRAM wudaoIv1061Idougui;
var m,i,t,j,n:longint;
f:array [0..1000,0..5000] of longint;
a:array [0..5000] of longint;
begin
readln(m,n);
for i:=n downto 1 do
read(a[i]);
for i:=1 to m do begin
t:=3*i;
for j:=t to n do
if (j>t) and (f -
02009-08-03 10:32:14@
此好题哉
花了一个半小时才想明白。
我明白了一个很大的道理,就是我一直都在想的转移方程没有考虑到所有状态。
这就是为什么要倒着做的原因,虽然我只懂得了这一方法。
因为正着不能既保证能够得到中间较高的人,又得到比较小的差值
而倒着做首先保证了能得到中间较高的人,然后只需要考虑i-1和i-2的状态,这样就可以得到最小差值。
虽然 程序才写了17行,都不用滚动 -
02009-08-02 10:21:46@
可以在空间上优化优化,var f:array[0..2,0..1000] of longint;就行勒
这个题难度3,但似乎是我写得最短的程序,只有18行,而且一次AC~ -
02009-07-27 13:24:53@
额,小于等于打成小于还有70分……汗
-
02009-07-25 20:59:14@
人生第一次在vijos上AC一道难度3的题……虽然第一次输多了点东西。。。。
就是考虑连带关系,和他的有序能干什么~~
-
02009-07-25 17:45:16@
skanony
其实某些时候,我们可以......
short int f[5001][1001];
-
02009-07-23 15:54:25@
DP,一定要倒着来,用-1去标记不存在的,想出来比较简单~
Program P1061;
var f:array[0..5100,0..1100] of longint;
a:array[0..5100] of longint;
i,j,n,m:longint;function min(a,b:longint):longint;
begin
if a=-1 then exit(b);
if b=-1 then exit(a);
if a>b then exit(b)
else exit(a);
end;Begin
fillchar(f,sizeof(f),0);
readln(m,n);
for i:=1 to n do read(a[i]);for i:=n downto 1 do
for j:=1 to m do
if n-i+1>=j*3 then
f:=min(f,f+sqr(a-a[i]))
else begin f:=-1;break;end;
writeln(f[1,m]);
end. -
02009-07-20 12:09:06@
C语言的朋友……数组是不可能开到[5001][1001]的了,用动态数组吧。
头文件Include一个malloc.hlong *f;/*注意是两个*号*/
f=(long*)malloc(sizeof(long*)*(n+1));
f[0]=(long*)malloc(sizeof(long)*(m+1)*(n+1));
for(a=1;a -
02009-07-17 16:51:09@
简单DP
-
02009-07-14 17:40:44@
不愧是src250,题解都写得那么XE
感谢guoti12321大牛的思路提供与KAI大牛得debug
还有我自己的编码以及加工
感谢人民感谢党……………………………………
那个……就用guori12321的做法就好,只是记住数据要倒着读进来
具体为什么吗……
对着那个try(i,i)好好想想,正着读的话,i不就是最高的了吗 -
02009-07-13 23:13:58@
总算AC了,花了我一下午和一晚上 不过对这种DP总算有了点感觉
DP要注意范围,下标的运用,最重要的是方程以及边界 这道题理解后会发现也不是很难fillchar(f,sizeof(f),0);
f[2,1]:=try(1,2);for i:=3 to n do
for j:=1 to min(i div 3, m) do
begin
if 3*j=i then f:=f+try(i-1,i)
else
f:=min(f,f+try(i-1,i));
end;
那个 if 3*j=i then 很重要,否则边界就不对了,会全部输出0的
另外,庆祝下我会发彩色的字了!!! -
02009-07-12 16:51:11@
Flag Accepted
题号 P1061
类型(?) 动态规划
通过 1300人
提交 3584次
通过率 36%
难度 3呵呵,第1300个通过的
-
02009-07-12 15:26:41@
var a:array [0..200000] of longint;
n,m,k,l,i,j,o,p,s:longint;
f:array [0..10000,0..1000] of longint;
begin
readln(m,n);
for i:=n downto 1 do
read(a[i]);
fillchar(f,sizeof(f),$7F);
for i:=1 to n do
f:=0;
for j:=1 to m do begin
f:=maxlongint div 2;
for i:=3*j to n do begin
if f -
02009-07-12 12:29:01@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:答案正确... 0ms
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:答案正确... 0ms
├ 测试数据 19:答案正确... 0ms
├ 测试数据 20:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-07-10 20:28:09@
好假的测评.........第一次UNAC........没有原因和记录....
第二次AC= =很诡异...........不信可以看看我的记录.......RUNNING -
02009-06-30 15:23:55@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:运行时错误...| 错误号: 103 | 文件未打开
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:运行时错误...| 错误号: 103 | 文件未打开
├ 测试数据 19:运行时错误...| 错误号: 103 | 文件未打开
├ 测试数据 20:运行时错误...| 错误号: 103 | 文件未打开
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:80 有效耗时:0ms灵异事件!太WS了!
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:答案正确... 0ms
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:答案正确... 0ms
├ 测试数据 19:答案正确... 0ms
├ 测试数据 20:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms完全一样的程序,结果就是这么不一样!
我用的是很朴素的DP算法。将高度倒着读进来。本来想DP记录前i个人分j组的最小残疾程度,但是转移超时。于是采用了滚动DP。只记录与当前第i个人相邻的前3个人的情况。这样DP[4,j]=min(DP[1,j-1],DP[2,j-1])+sqr(h[i]-h)就行了。不用DP[3,j]的值是因为必然用相邻的两个人作为同组的矮人比间隔的更好。这样时间复杂度为C*M*N的,秒了。
-
02009-05-13 16:38:21@
每一层循环
先要判断i是否大于等于2*j
如若满足则
有以下动态方程:
f:=f;
f:=min(f,f+sqr(da[i]-da));
(因为应当满足最后有足够的高个人数,因此上述方程应满足 (m-j)*3 -
02009-05-09 23:15:10@
原来有时不能直接套方程