1. 程式人生 > >最大欄位和 衝出暴力列舉

最大欄位和 衝出暴力列舉

這篇解題報告是對我最近一些題的總結,裡面的程式碼都是我解題,優化,再優化的過程的記錄,記錄了自己對演算法的完善與優化思路,還有對程式設計哲學的理解:do it,do it well。

很感謝孫老師您,讓自己可以找到利用計算機作比只是單純玩遊戲更有意義又更有趣的事情,又通過您的課,通過照著您給的路自己不斷探索,感覺自身能力得到了很大的提升,從當時一個小程式漏洞百出,思路拙劣,對oj系統的不熟悉,甚至當時上課時平時的練習和考試都讓自己感覺不盡人意,到現在自己不斷地追求完善程式碼完善思路,追求完美追求最優,雖然還是拙劣但是感覺自己在努力,感覺在自己現有的知識程度上已經做的很美了,這種在心裡湧上的孜孜不倦的追求的感覺讓自己感覺到了人生的意義,正如歌德在《浮士德》裡所表達的主題一樣,完善的境界永遠不可及,人類所能達到的最高成就,恰在於一種自強不息的創造性生活本身,一種不斷進步的道路與過程本身。

好了,說了那麼多,該切入正題了,審視自身的努力,反思自己的不足,就可以很清楚的一個菜鳥標準的特徵是:耗時費力的暴力列舉浪費了大量資源,永遠不變的單一的選擇排序,不自覺暴露出的goto使用……所以我今天借三個同樣是關於求出最優解的問題,來說明我是怎麼衝出暴力列舉。

第一個問題,很簡單,是ustcoj上的1389,連續子陣列的和,題目大意如下:輸入一個整型陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。(數組裡的元素可正可負)

想都不用想,直接暴力列舉,太容易了,且只是個o(n^2)的演算法,由於n小於5000,必然不用當心超時,直接用暴力列舉就可以過了,看程式碼:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <stdio.h> #define max 5000 int a[max+1]; int qiuzhi(int n)                 //列舉所有的情況,返回裡面的最大值 { int i,j,ans,temp; ans=a[0]; for

相關推薦

暴力列舉

這篇解題報告是對我最近一些題的總結,裡面的程式碼都是我解題,優化,再優化的過程的記錄,記錄了自己對演算法的完善與優化思路,還有對程式設計哲學的理解:do it,do it well。 很感謝孫老師您,讓自己可以找到利用計算機作比只是單純玩遊戲更有意義又更有趣的事

分治法 解決問題

分治法求解最大欄位和問題 1 問題描述   給定由n個整數(可能由負數)組成的序列(a1, a2,...,an),最大欄位和問題求 該序列中連續子段和的最大值,並找出這個連續子段。 2 使用python程式設計解決,具體程式碼如下   # 求出最大子段和, 以及最大子段和 對應的位置

動態規劃

最大子段和 給定由n個整數(可能有負整數)組成的序列(a1,a2,…,an),最大子段和問題要求該序列形如 的最大值(1<=i<=j<=n),當序列中所有整數均為負整數時,其最大子段和為0。 #include<stdio.h> #include<

演算法 |

         #include <stdio.h> int a[100001],dp[100001]; int main() { int T,n; while(~scanf("%d",&n)) {

HDU 1231 簡單DP之

原題地址:http://acm.hdu.edu.cn/showproblem.php?pid=1231 演算法核心: 動態規劃, 陣列為vec[]vec[],設dp[i]dp[i] 是以vec[i]

關於的若干解法優化

最大欄位和是常見的一個入門演算法問題,根據演算法的優化程度,這裡分為了四種方法: 第一種:複雜度為O(N ^ 2),兩個用於語句巢狀 int summax_1(int *a,int tem) { int temp=0,temp_maxi=0,temp_maxj=

演算法優化:,雙指標遍歷(n^2),分治法(nlogn),動態規劃(n)

最大欄位和,有點類似與最長公共子序列,這裡是求連續一段求和最大的一段,比如[-2,11,-4,-4,13,-5,-2]最大求和的連續一段為11,-4,-4,13,和為16. 最基本的雙針模型遍歷,兩個指標,分別代表最大和序列的起始和終止,演算法時間複雜度O(n^2) # 以下演算法時

POJ 1050 To the Max 大子矩陣(二維的

傳送門: To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52306 Accepted: 27646 Description Given a two-dimensional array of positive

poj1050及其衍生

每天做poj都會感覺到自己的收穫,今天做的是poj1050,以前沒接觸這些演算法類的東西,也就在資料結構課上水過兩把,所以每天接觸到這些新的東西覺得挺有意思,也確實感覺自己收穫了不少。 poj1050是一個欄位和的題,什麼是欄位和以及他的具體實現我是在這篇部落格上學到的,點

的3中解法

問題描述:     給定n個整數,組成序列a[1], a[2], a[3], ... a[n],求形如a[i]+a[i+1]+...+a[j]的欄位和的最大值。 // 最大子段求和,窮舉法,複雜度O(n^2) // 輸入引數:a[]儲存資料,其中a[0]儲存資料個數 //

【演算法設計與分析】6、

/** * 書本:《演算法分析與設計》 * 功能:若給定n個整陣列成的序列a1, a2, a3, ......an, 求該序列形如ai+a(i+1)+......+an的最大值 * 檔案:MaxSum.cpp * 時間:2014年11月30日17:37:26 * 作者:cu

LeetCode——第53題:

題目: 給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6

——動態規劃

最大欄位和,常規解法有四種,分別是: 1、三重for迴圈; 2、兩重for迴圈; 3、分治解法; 4、動態規劃; 從時間複雜度的角度講,動態規劃是最優演算法,故對其簡單介紹: #include<iostream> using namespace std;

求陣列簡潔有效的演算法

直接上程式碼:public static int max(int[] a){ int max = 0;int zmax = 0; for (int i = 0;i<a.length;i++){ zmax += a[

動態規劃:問題

import java.util.Scanner; /* * 最大子段和問題,-2 11 -4 13 -5 -2中最大的子段和 */ public class MaxSum { publi

基礎演算法--B

Description Given a sequencea[1],a[2],a[3]......a[n], your job is to calculate the max sum of asub-sequence. For example, given (6,-1,5,4

問題(常規法,分治法,動態規劃法)

演算法設計與分析-----求最大欄位和問題    問題描述:給定由n個整陣列成的序列(a1,a2,a3......,an),求該序列的子段的最大值. 常規法: 從a1開始,求出以a1開頭的子序列最大的和為sum,依次從a2開始,在sum等於以a1開頭的基礎上,與以

蠻力、分治、動態規劃求解問題(aardio)

最近的演算法課上要求做的一個實驗是分別用蠻力、分治、動態規劃求解最大欄位和問題。 以下是相關程式碼: 陣列求和程式段: var getsum = function(tab,frist,l

Maximum sum【變式】

【題目描述】 對於給定的整數序列A={a1,a2,…,an}A={a1,a2,…,an},找出兩個不重合連續子段,使得兩子段中所有數字的和最大。我們如下定義函式 d(A): 我們的目標就是求出d(A)。 【輸入】 第一行是一個整數T(≤30),代表一

@column 瞬時

大欄位     @Lob //對應Blob欄位型別        @Column(name = "PHOTO")        private Serializable photo;        @Lob //對應Clob欄位型別        @Column(name