hdu 命运

这题一看思路跟数塔,天上掉馅饼一样,从后面往前推,不断比较,更新,就ok了。。

发现自己的编程能力还有有待提高,思路那么明确,我编的速度真的有点慢,还出现了各种

错误,死循环等等等。。加油,努力提高编程努力。。。。

错误代码如下 :

 
  
#include < stdio.h >
#include
< string .h >
#include
< stdlib.h >
#include
< debug.h >
int A[ 21 ][ 1001 ],flag2 = 0 ,a1 =- 2000 ;
int fun( int x , int y)
{
return x > y ? x:y;
}
int array( int x, int y)
{

flag2
= fun(x,y);
if (flag2 > a1)
a1
= flag2;
return 0 ;
}
int main( )
{
int N,i,j,x,y,t,m,n,p,q,k,flag = 0 ;
Debug();
scanf(
" %d " , & N);
while (N -- )
{
scanf(
" %d%d " , & x, & y);
for (i = 0 ;i <= x + 1 ;i ++ )
for (j = 0 ;j <= y + 1 ;j ++ )
A[i][j]
=- 10000 ;
for (i = 1 ;i <= x;i ++ )
for (j = 1 ;j <= y;j ++ )
{
scanf(
" %d " , & t);
A[i][j]
= t;
}

for (i = x;i >= 1 ;i -- )
{
for (j = y;j >= 1 ;j -- )
{
if (i == x &&! flag)
j
= y - 1 ,flag = 1 ;

for (k = 1 ;k <= 20 ;k ++ )
{
if (j * k <= y)
array(A[i][j
* k + 1 ],A[i + 1 ][j]);
else
break ;

}

A[i][j]
+= a1;

// printf("%d %d %d\n",a1,k,A[i][j]);
a1 =- 2000 ;
// j--;
// printf("%d ",j);
// printf("******\n\n");
}

}
printf(
" %d\n " ,A[ 1 ][ 1 ]);
}
return 0 ;
}
犯的错误有:1)很多变量的定义应该放在while(N--)里面。。否则运行一次后就会出错。
2)题目意思没看清楚,只能走(x+1,y),(x,y+1),(x,y*k)k>=2的。
正确代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<debug.h>
int A[35][1015],flag2=0,a1=-1000;
int fun(int x ,int y)
{
 return x>y? x:y;
}
int fun1(int x,int y,int z)
{
    return fun(fun(x,y),z);
}
int array(int x,int y,int z)
{ 
  
  flag2=fun1(x,y,z);
  
  if(flag2>a1)
    a1=flag2;
  return 0;
}
int main( )
{
 int N,i,j,x,y,t,m,n,p,q,k,flag;
 Debug();
 scanf("%d",&N);
 while(N--)
 {
 flag=0;
 flag2=0,a1=-1000;
 scanf("%d%d",&x,&y);
 for(i=0;i<=30;i++)
 for(j=0;j<=1010;j++)
 A[i][j]=-1000;
 for(i=1;i<=x;i++)
  for(j=1;j<=y;j++)
   {
    scanf("%d",&t);
      A[i][j]=t;
   }
   
 for(i=x;i>=1;i--)
   {
    for(j=y;j>=1;j--)
     { 
       if(i==x&&!flag)
       j=y-1,flag=1;
       array(A[i][j+1],A[i+1][j],-1000);
       for(k=2;k<=1000;k++)
       {
       if(j*k<=y)
       {
       array(A[i][j+1],A[i+1][j],A[i][j*k]);
       }
       }
    
       A[i][j]+=a1;      
        a1=-1000;
     }
       
  }   
  
  printf("%d\n",A[1][1]); 
 // printf("***");
  //system("pause");
   
}
 return 0;
}


转载于:https://www.cnblogs.com/tangcong/archive/2011/04/19/2021457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值