hdu1335

题意:有一片矩形花生田在路的一侧,田上的整数坐标位置有0个或多个花生,现规定从路上走到田地最边上的某个格点位置、从田边上走回路上、从一个格点移动到另一个格点、采摘格点上的花生,这四种动作都要花费一单位的时间,每次必须采摘花生数最多的格点,给出限定时间,问能采多少花生。

我一开始没有看见每次必须采摘花生数最多的格点,于是,我考虑了状压 DP 这种高端做法```本来又该满心欢喜地敲的时候发现样例并通不过```我百思不得其解后重新研读了一下题意才发现那个条件```于是```并不是高端的 DP 题,而是一道彻头彻尾的水题啊!只是模拟一下采花生的路线,反正路线肯定是从大到小固定的,然后就这样算每次的时间会不会超时,如果不超时就继续下一个点,如果超时了就输出上一个点的花生数。

中间我还RE了两法,原因是我的c初始化位置放错,导致c在循环中一直增加最终越界```低级错误啊```

 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<algorithm>

 4 #include<math.h>

 5 using namespace std;

 6 

 7 struct point{

 8     int x,y,n;

 9 }p[10000];

10 

11 int dp[10000],t[10000];

12 

13 int cmp(point p1,point p2){

14     return p1.n>p2.n;

15 }

16 

17 int main(){

18     int T;

19     while(scanf("%d",&T)!=EOF){

20         int M,N,K;

21         int i,j,k;

22         for(int q=1;q<=T;q++){

23             int c=0;

24             memset(p,0,sizeof(p));

25             memset(dp,0,sizeof(dp));

26             memset(t,0,sizeof(t));

27             scanf("%d%d%d",&M,&N,&K);

28             for(i=1;i<=M;i++){

29                 for(j=1;j<=N;j++){

30                     int n;

31                     scanf("%d",&n);

32                     if(n){

33                         c++;

34                         p[c].x=i;

35                         p[c].y=j;

36                         p[c].n=n;

37                     }

38                 }

39             }

40             sort(p+1,p+c+1,cmp);

41             for(i=1;i<=c;i++){

42                 if(i==1)t[i]=p[i].x+1;

43                 else t[i]=1+t[i-1]+abs(p[i].x-p[i-1].x)+abs(p[i].y-p[i-1].y);

44                 if(t[i]+p[i].x>K)break;

45                 else{

46                     dp[i]=dp[i-1]+p[i].n;

47                 }

48             }

49             printf("%d\n",dp[i-1]);

50         }

51     }

52     return 0;

53 }
View Code

 

你可能感兴趣的:(HDU)