| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:非常经典的动态规划,用递归下的记忆化搜索来实现。我将整个实现流程和很多容易错的地方都注释起来,希望能够对那些比较困惑的朋友有所帮助。这程序花了我半个小时调试和写注释,题不在多,经典则行。好晚了,好累,睡觉~~In Reply To:非常经典的动态规划,用递归下的记忆化搜索来实现。我将整个实现流程和很多容易错的地方都注释起来,希望能够对那些比较困惑的朋友有所帮助。这程序花了我半个小时调试和写注释,题不在多,经典则行。好晚了,好累,睡觉~~ Posted by:gfedcba at 2009-02-28 03:37:51 其实吧,像这个矩阵完全是可以转化为一维线性表就行了,上下左右几个方向也很好表示的,(-c)(+1)(+c)(-1),然后也很容易判断是否在边界上。排序,转移很简单了。。。。ac,复杂度是O(r*c):指教指教呗,谢谢;
#include<stdio.h>
int r,c;
long f[10004],tt;
int p[10004],pos[10004],poss[10004],pp[5];
int maxx(int a,int b)
{
if (a>b)
return a;
else
return b;
}
void qsort(int a,int b)
{
int i,j,tmp,k;
i=a;j=b;
k=p[(i+j)/2];
while (i<=j)
{
while (p[i]<k) i++;
while (p[j]>k) j--;
if(i<=j)
{
tmp=p[i];p[i]=p[j];p[j]=tmp;
tmp=pos[i];pos[i]=pos[j];pos[j]=tmp;
poss[pos[i]]=i;poss[pos[j]]=j;
i++;j--;
}
}
if (a<j) qsort(a,j);
if (i<b) qsort(i,b);
}
int main()
{
int i,j;
int max,tot;
tot=0;
scanf("%d%d",&r,&c);
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
{
scanf("%d",&tt);
tot++;
p[tot]=tt;
pos[tot]=tot;
poss[tot]=tot;
}
qsort(1,tot);
max=0;
for (i=1;i<=tot;i++)
{
f[i]=1;
pp[1]=pos[i]-c;pp[2]=pos[i]+1;pp[3]=pos[i]-1;pp[4]=pos[i]+c;
for (j=1;j<=4;j++)
{
if ((pp[j]<=tot)&&(pp[j]>=1)&&(p[poss[pp[j]]]<p[i]))
{
if ((j==2)&&(pp[j]%c==1)) continue;
if ((j==3)&&(pp[j]%c==0)) continue;
f[i]=maxx(f[i],f[poss[pp[j]]]+1);
}
}
max=maxx(max,f[i]);
}
printf("%d\n",max);
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator