Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

按长度dp而已…WHY  WA????…WA的我要哭……

Posted by JokerKS at 2010-10-04 15:02:10 on Problem 2823
RT
思路是:
设读入的数组为s[],
//找数组中连续j个数组成的串
//该串以s[i]开头,以s[i+j-1]为尾,p为正中间(偏后)的数
//例如:对于数组[3,1,5,6,8,1,7],
   i=2,j=4时,该子串为[1,5,6,8];p为4,s[p]=6;

核心:max[2,3,4,5]等于max[2,3]与max[4,5]中的较大值
      即dp[i][i+j-1]=max(dp[i][p-1],dp[p][i+j-1]);
     如此可以找出长为2,4,8,16…的串中最大(小)数
//则对于任意长度串:如max[2,3,5,7,1,6],求max[2,3,5,7]与max[5,7,1,6]中大值即可

由于空间不够,只好开成滚动数组
dp[i]表示以i开头连续j个数中最大值,dps[i]则是最小值,dp[i],dps[i]初值都等于s[i],
代码就是:
(下标从1开始)
for(j=2;j<=k;j*=2)
    for(i=1,p=j;p<=n;i++,p++)  
        {
         if(dp[p]>dp[i])  dp[i]=dp[p]; 
         if(dps[p]<dps[i])dps[i]=dps[p];
        }
下面是输出:
j/=2;
for(i=1,p=k-j+1,m=n-k+1;i<=m;i++,p++)
     printf("%d ",dps[i]<dps[p]?dps[i]:dps[p]);
printf("\n");
for(i=1,p=k-j+1,m=n-k+1;i<=m;i++,p++)
     printf("%d ",dp[i] > dp[p]? dp[i]: dp[p]);
printf("\n");

WHY  WA???
那位大牛请指点一二,感激不尽!!!

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator