| ||||||||||
| 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 | |||||||||
我的改进版,0MS~~
/*
#include <cstdio>
int T[11],Coins[11],n;
int c[20002],c1[20002];
int main()
{
int m,i,j,sum=0;
scanf("%d%d",&n,&m);
for (i=0;i<n;i++)
scanf("%d",&T[i]);
for (i=0;i<n;i++)
{
scanf("%d",&Coins[i]);
sum+=Coins[i]*T[i];
}
for (i=1;i<=sum;i++)
{
c[i]=0xfffffff;
c1[i]=0xfffffff;
}
c[0]=0;c1[0]=0;
for ( i=0;i<n;i++)
for ( j=1;j<=Coins[i];++j)
for (int k=sum;k>=0;--k)
if (k-T[i]>=0)
if (c[k-T[i]]+1 < c[k])
{ c[k]=c[k-T[i]]+1; }
int min=0xfffffff;
for ( i=0;i<n;i++)
for ( j=1;j<=Coins[i];++j)
for (int k=0;k<=sum-m;++k)
while (k-T[i]>=0 && c1[k-T[i]]+1 < c1[k])
{ c1[k]=c1[k-T[i]]+1; }
for (i=m;i<sum;i++)
if (c[i] != 0xfffffff && c1[i-m]!= 0xfffffff)
if (c[i]+c1[i-m]< min)
{min=c[i]+c1[i-m];}
if (min==0xfffffff) printf("-1\n");
else printf("%d\n",min);
return 0;
}*/
#include <cstdio>
int height[102][102]; //高度
int wt[102][102]; //记录各点到达的最长长度
int r,c; //行数和列数
int DP(int i,int j)
{
if (wt[i][j])
return wt[i][j]; //如果已经递归过,长度值就不为初始值(0)了,避免重复运算
int max=0;
int p,h=height[i][j]; //利用递归找到邻近点中长度最长的
if ((p=i-1)>=0 && height[p][j]<h)
if ( DP(p,j)>max)
max=DP(p,j);
if ((p=i+1)<r && height[p][j]<h)
if (DP(p,j)>max)
max=DP(p,j);
if ((p=j-1)>=0 && height[i][p]<h)
if (DP(i,p)>max)
max=DP(i,p);
if ((p=j+1)<c && height[i][p]<h)
if (DP(i,p)>max)
max=DP(i,p);
wt[i][j]=max+1; //这里使用了和上面楼主一样的技巧,如果四个更新后max仍为0,会被赋以初始值
return wt[i][j];
}
int main()
{
scanf ("%d%d",&r,&c);
int max=0;
for (int i=0;i<r;++i)
for (int j=0;j<c;++j)
{
scanf("%d",&height[i][j]);
wt[i][j]=0;
}
for (int i=0;i<r;++i)
for (int j=0;j<c;++j)
if (DP(i,j)>max)
max=DP(i,j);
printf("%d\n",max);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator