洛谷 P2096 最佳旅游线路

某旅游区的街道成网格状。其中东西向的街道都是旅游街,南北向的街道都是林阴道。由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走。

阿龙想到这个旅游街游玩,他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之见的街道值得游览的程度,分值是从-100到100的整数,所有林阴道不打分。所有分值不可能全是负分。如图:

输入输出格式

输入格式:

输入文件的第一行是两个整数m和n,之间用一个空格隔开,m表示有m条旅游街(1≤m≤100 ),n 表示有(n+1)条林阴道(1≤n≤20001 )。接下来的m行依次给出了由北向南每条旅游街的分值信息。每行有n个整数,依次表示了自西向东旅游街每一小段的分值。同一行相邻两个数之间用一个空格隔开。

输出格式:

输出文件只有一行,是一个整数,表示你的程序找到的最佳游览线路的总分值。

输入输出样例

输入样例#1: 
3 5 
-50 -47 36 -30 -23 
17 -19 -34 -13 -8 
-42 -3 -43 34 -45 

输出样例#1:

84

 


e,边做题,边写题解,大致读了遍题,是道 贪心,
那么我们分析一下题,图大概是下面这个样子:




------------


竖直方向可以随便走嘛,所以求出每一列
的最大值,再做比较就可以了。


------------
but,命运多舛,交了一遍,80分,有两个点过不了,重读遍题发现:对了,不一定要在最右边结束,也不一定在最左边开始,这点很重要,这才AC了此题。
先上代码


------------

八十分版

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 #define R register
 9 #define mmax 20002
10 ll n,m,maxx=-0x7fffffff,ans;
11 ll tu[102][mmax],da[mmax];
12 int main()
13 {
14     /*freopen(".in","r",stdin);
15     freopen(".out","w",stdout);*/
16     cin>>m>>n;
17     for(int i=1;i<=m;i++)
18     for(int j=1;j<=n;j++)
19     {
20     cin>>tu[i][j]; //输入
21     }
22     /*for(int i=1;i<=m;i++)
23         for(int j=1;j<=n;j++)
24     {
25     cout<<tu[i][j]<<" ";
26     }*/
27     
28     for(int i=1;i<=n;i++)
29     {
30         maxx=-0x7ffffff;
31         for(int j=1;j<=m;j++)
32             {
33                if(tu[j][i]>maxx)//注意i和j的顺序
34                {
35                da[i]=tu[j][i];
36                maxx=tu[j][i];//
37                }
38               
39             }
40         }
41         /*for(int i=1;i<=n;i++)
42         {
43             cout<<da[i]<<" ";//最大值
44         }*/
45         ll qzh1=0,qzh2=0;
46         for(int i=1;i<=n;i++)
47         {    
48             qzh1=qzh2+da[i];
49             qzh2=qzh1;
50             if(ans<qzh1) ans=qzh1;
51         }
52         cout<<ans<<endl;
53     /*fclose(stdin);
54     fclose(stdout);*/
55     return 0;
56 }


------------
一百分版

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 #define II int
 9 #define R register
10 #define mmax 20002
11 #define inf 0x7ffffff
12 II n,m,ans;
13 II tu[102][mmax],da[mmax];
14 II mxsum(II *x){   //最大子串和
15     II th=0;
16     II mx=0;
17     for(R II i=1;i<=n;++i){
18         th+=x[i];
19         if(th<0)th=0;
20         else if(th>mx)mx=th;
21     }
22     return mx;
23 }
24 int main()
25 {
26     /*freopen(".in","r",stdin);
27     freopen(".out","w",stdout);*/
28     cin>>m>>n;
29     for(int i=1;i<=m;i++)
30     for(int j=1;j<=n;j++)
31     {
32         cin>>tu[i][j]; //输入
33     }
34     for(int i=1;i<=n;i++)
35     {
36         da[i]=-inf;
37         for(int j=1;j<=m;j++)
38            if(tu[j][i]>da[i])//注意i和j的顺序
39            {
40                    da[i]=tu[j][i];、、每列最大值
41            }
42     }
43     cout<<mxsum(da)<<endl;
44     /*fclose(stdin);
45     fclose(stdout);*/
46     return 0;
47 }


就这样了,好好打,别变棕哟QWQ。

posted @ 2018-08-02 06:56  enceladus  阅读(62)  评论(0编辑  收藏

Contact with me