题意:有一片矩形花生田在路的一侧,田上的整数坐标位置有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