November | ||||||
---|---|---|---|---|---|---|
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
跪求一个证明我错了的用例……
这两天无聊刷HDOJ,各种不爽啊。C语言果然是忘记光了。
今天遭遇1003题。这题网上一搜倒是一堆讨论的,全是不知道自己死在哪的。而回复则大多是“这是一道典型/经典/简单的动态规划题”,然后给个AC的代码。我不知道动态规划是什么,当年学的时候没注意听就算听了现在也早忘记掉了,但是你给个正确的代码并不能表示我的就是错的啊…… 如果说错了,那么到底错哪里呢…… 跪求一个能证明我错了的测试用例……
HDOJ 1003 题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
我的代码:
#include <stdio.h> int main(){ int times, numbers; long a, result, pretend; int i,j,s,e; scanf("%d",×); for(i=1;i<=times;i++){ scanf("%d",&numbers); scanf("%ld",&a); result = a; pretend = a; s = 1; e = 1; for(j=2;j<=numbers;j++){ scanf("%ld",&a); pretend += a; if(pretend>result){ result = pretend; e = j; } if(a>result){ result = a; s = j; e = j; } } printf("Case %d:\n%ld %d %d\n",i,result,s,e); if(i!=times){ printf("\n"); } } return 0; }
----- 2013.02.01 P.S.-------------------
因为不知道DP具体是个啥,今天抽空查了些资料,草草研究了下DP究竟是怎么回事,并参考了别人的一些代码,虽然错误用例还是没能找到。 我的代码的算法大致可以这样描述吧:
MaxSum[1] = ValueN[1];
MaxSum[n] = (MaxSum[n-1]+ValueN[n]>MaxSum[n-1]? MaxSum[n-1]+ValueN[n]: MaxSum[n-1]) > ValueN[n] ? $1: ValueN[n]
$1 表示 前一个判断得到的结果。
第一个判断 MaxSum[n-1] + ValueN[n] > MaxSum[n-1] ? 只要 ValueN[n] >0就能成立
第二个判断 MaxSum[n-1] + ValueN[n] > ValueN[n],成立条件是 MaxSum[n-1] > 0,第二个判断的另一个分支 MaxSum[n-1] > ValueN[n] 则不能直接看出正负关系,但是因为要走到这个分支,必然要求ValueN[n]为负,要小于一个负数的话,MaxSum[n-1] 必然也得是负数,这样才能让条件不成立从而得到ValueN[n]。换句话说,只要 MaxSum[n-1] >0, 第二个判断得到的结果都是 MaxSum[n-1] + ValueN[n] 或者 MaxSum[n-1]。
写成这样了之后,看上去好像也是个DP吧…… 不知道有没有高人能给分析分析。
Sat, 26 Jan 2013 02:13:12 +0000
"If there are more than one result, output the **first** one."
if(a>result)
Sat, 26 Jan 2013 11:58:36 +0000
那这个“first" 到底怎么定义呢? 比如说一个数列是 0 0 1 0 0 ,那么输出应该是 1 1 5 还是 1 1 3 还是1 3 3?
实际上我把 a>=result 改成 a>result 也是一样WA的,把上面的pretend >= result 改成 > 也还是一样WA
Mon, 28 Jan 2013 11:04:37 +0000
你这个代码没用到dp吧,这个用O(n)复杂度即可解决。而且我不太看得懂你的代码,
scanf("%d",×);
for(i=1;i<=times;i++){
你times赋初值了吗
Mon, 28 Jan 2013 15:55:08 +0000
我的是没用到dp,但是我的也没比O(n)更复杂…… scanf("%d",×); 这里其实是 scanf("%d",×); 复制到这里的时候不知道为什么被改了汗…… 我这就改回去……
Tue, 29 Jan 2013 05:55:18 +0000
7 0 6 -1 1 -6 7 -5
这个例子你就通不过啊,你的输出是
7 6 6
Tue, 29 Jan 2013 08:10:17 +0000
额,这个不应该是 7 6 6 吗? 或者说应该是 7 1 6? 我不明白这里的 first 怎么认定。我可以把程序改成能得到 7 1 6的,但是一样WA……
Fri, 01 Feb 2013 01:47:29 +0000
7 0 6 -1 1 -6 7 -5
这个答案不应该是 14 0 6 么? 如果first是0的话。
题目给出的sample是错的吧
Fri, 01 Feb 2013 03:04:57 +0000
不是的。第一个数字7表示这一个数列总共有7个数字,不算在数列本身内。而数列的起止位置是从传统的1开始算,不是计算机的0开始
Thu, 28 Feb 2013 01:39:51 +0000
不明觉厉~这道题解法很多,不过不管怎么做核心算法都不会超过5行。