codeforces116d

题意:有一块n*m的草坪,g代表草,w代表种子,从(1,1)这点出发,然后走完所有是w的点

首先可以确定一点是从上到下,不会回头,这样还是挺好想的(你其实可以看成一行上的移动),因为回头的话会加上原来的一步了,然后怎么在单一行里面走,这就是我一直纠结的地方!

我觉得这题没有一点dp的意思,如其说dp,还不如说是贪心,单行我还是不会证明,下次再学吧!

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int n,m;
 5 char sz[153][153];
 6 int  gz[153][153];
 7 int main(){
 8     scanf("%d%d",&n,&m);
 9     getchar();
10     for(int i=1;i<=n;i++) scanf("%s",sz[i]);
11     for(int i=1;i<=n;i++){
12         for(int j=1;j<=m;j++){
13             gz[i][j]=(sz[i][j-1]=='W');
14         }
15     }
16 //    for(int i=1;i<=n;i++){
17 //        for(int j=1;j<=m;j++){
18 //            printf("%d ",gz[i][j]);
19 //        }
20 //        printf("\n");
21 //    }
22     ll las=1,now=1,ans=0;
23     for(int i=1;i<=n;i++){
24         ll st=-1,ed=-1;
25         for(int j=1;j<=m;j++){
26             if(gz[i][j]==1){
27                 if(st==-1) st=j;
28                 ed=j;
29             }
30         }
31         if(st==-1) continue;
32         las=i;
33         if(i%2==1){
34             if(now>st){
35                 ans+=abs(st-now);
36                 now=st;
37             }
38             ans+=abs(ed-now);
39             now=ed;
40         }else{
41             if(now<ed){
42                 ans+=abs(ed-now);
43                 now=ed;
44             }
45             ans+=abs(st-now);
46             now=st;   
47         }
48         //printf("%d\n",ans);    
49     }
50     //printf("%d %d\n",ans,las);
51     cout<<ans+(las-1)<<endl;
52     return 0;    
53 }
View Code

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9940736.html