hdu 1081【To The Max】

本文介绍了一种通过将二维数组转换为一维数组,进而求解最大子序列和问题的算法实现,该算法在实践中表现出优异的性能,仅需15ms即可完成计算。

不知道0ms思路是咋样的,偶滴代码15ms……

就是转换成一维数组,然后求最大子序列和……

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int n;
 5 int inp[105][105];
 6 int temp[105][105];
 7 
 8 int get_sum(int t[])
 9 {
10     int dp[105];
11 
12     dp[0]= t[0];
13     for(int i = 1;i < n;i ++)
14     {
15         if(dp[i-1]>= 0)
16             dp[i] = dp[i-1] + t[i];
17         else
18             dp[i] = t[i];
19     }
20     int ans = dp[0];
21     for(int i = 1;i < n;i ++)
22     {
23         if(ans < dp[i])
24             ans = dp[i];
25     }
26 
27     return ans;
28 }
29 
30 int main()
31 {
32     while(scanf("%d",&n) == 1)
33     {
34         for(int i = 0;i < n;i ++)
35         {
36             for(int j = 0;j < n;j ++)
37             {
38                 scanf("%d",&inp[i][j]);
39                 temp[i][j] = inp[i][j];
40             }
41         }
42 
43         int ans = get_sum(inp[0]);
44         for(int i = 1;i < n;i ++)
45         {
46             int num = get_sum(inp[i]);
47             if(ans < num)
48                 ans = num;
49         }
50 
51         for(int i = 1;i < n;i ++)
52         {
53             for(int j = 0;j < n - i;j ++)
54             {
55                 for(int k = 0;k < n;k ++)
56                 {
57                     inp[j][k] += temp[j+i][k];
58                 }
59                 int num = get_sum(inp[j]);
60                 if(ans < num)
61                     ans = num;
62             }
63         }
64         
65         printf("%d\n",ans);
66     }
67 
68     return 0;
69 }

转载于:https://www.cnblogs.com/Shirlies/archive/2012/08/15/2640481.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值