2018.01.01(數字三角形,最長上升子序列等)

2017.12.24

?簡單的動態規劃

1.數字三角形(算法引入)

題目描述:下圖所示是一個數字三角形,其中三角形中的數值為正整數,現規定從最頂層往下走到最底層,每一步可沿左斜線向下或右斜線向下走。設三角形有n層,編程計算出從頂層到底層的一條路徑,使得該路徑上的和最大,輸出最大值。(n<=100)

思路&&代碼(搜索回溯):

最顯而易見的思路,既然要求一條最短的路徑,最簡單的方法就是遍歷所有的路徑,找到一條最優的。時間復雜度是O(2n)以下是搜索代碼。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],n;
 5 int count=0,ans=-20180101;
 6 void search(int x,int y){
 7   count+=map[x][y];
 8   if(x==n){
 9     if(count>ans)ans=count;
10   }
11   else{
12   search(x+1,y+1);
13   search(x+1,y);
14   }
15   count-=map[x][y];
16 }
17 int main(){
18   scanf("%d",&n);
19   int i,j;
20   for(i=1;i<=n;i++){
21     for(j=1;j<=i;j++){
22       scanf("%d",&map[i][j]);
23     }
24   }
25   search(1,1);
26   printf("%d\n",ans);
27   return 0;
28 }
View Code

思路&&代碼(分治法):

對于任意一個點,我們可以把它的最大值和看成Max(sum[i+1][j],[i+1][j+1]),分解為兩個規模更小的子問題。但是本質上和搜索沒有區別,所以時間復雜度還是O(2n)。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int n,map[101][101];
 5 int fenzhi(int x,int y){
 6   if(x==n)return map[x][y];
 7   int zi1,zi2,_max;
 8   zi1=fenzhi(x+1,y);
 9   zi2=fenzhi(x+1,y+1);
10   if(zi1<=zi2)_max=zi2;
11   else           _max=zi1;
12   return _max+map[x][y];
13 }
14 int main(){
15   scanf("%d",&n);
16   int i,j;
17   for(i=1;i<=n;i++){
18     for(j=1;j<=i;j++){
19       scanf("%d",&map[i][j]);
20     }
21   }
22   printf("%d",fenzhi(1,1));
23   return 0;
24 }
View Code

思路&&代碼(記憶化):

比搜索要更優。我們注意到,不管是搜索還是分治,它們都是O(2n)的時間復雜度,是因為它們算了一些重復的東西。既然有重復,那我就把這些重復算的東西用一個數組保存起來,要用時就不用再去算一遍,只要調用了。所以把時間復雜度大大提升了,只有O(n2)了。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],book[101][101];
 5 int n;
 6 int max(int x,int y){
 7   if(y>x)
 8     return y;
 9   else
10     return x;
11 }
12 int search(int r,int c){
13   int ans;
14   if (r==n) return map[r][c];
15   if (book[r+1][c]==-1)
16     book[r+1][c]=search(r+1,c);
17   if (book[r+1][c+1]==-1)
18     book[r+1][c+1]=search(r+1,c+1);
19   ans=max(book[r+1][c],book[r+1][c+1])+book[r][c]; 
20   return ans;
21 }
22 int main(){
23   scanf("%d",&n);
24   int i,j;
25   for(i=1;i<=n;i++){
26     for(j=1;j<=i;j++){
27       scanf("%d",&map[i][j]);
28       book[i][j]=-1;
29     }
30   }
31   printf("%d",search(1,1));
32   return 0;
33 }
View Code

思路&&代碼(動態規劃):

自底向上。第i層的任意一個點,其最大值是它自己加上它下一層的兩個點的最大值之和。用i表示行,j表示列,狀態轉移方程如下。這樣,時間復雜度也只有O(2n)。

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 int map[101][101],book[101][101];
 5 int max(int x,int y){
 6   if(x>y)return x;
 7   else   return y;
 8 }
 9 int main(){
10   int n;
11   scanf("%d",&n);
12   int i,j;
13   for(i=1;i<=n;i++){
14     for(j=1;j<=i;j++){
15       scanf("%d",&map[i][j]);
16     }
17   }
18   for(j=1;j<=n;j++)
19     book[n][j]=map[n][j];
20   for(i=n-1;i>=1;i--)
21     for(j=1;j<=i;j++)
22         book[i][j]=max(book[i+1][j+1],book[i+1][j])+map[i][j];
23        printf("%d",book[1][1]);
24   return 0;
25 }
View Code

2.最長上升子序列

思路:

對于以第i個數為右端點的一個序列,他本身就是一個長度為1的上升子序列。這時,如果它的右邊有比它數值更小的數,這時的最長上升子序列就是這個元素本身的長度1和以他前面的比他數值更小的這個元素為右端點的最長上升子序列的長度和。

狀態轉移方程:sum[i]=_Max(sum[i],sum[j]+1); ?(j<i,num[j]<num[i])

核心代碼:

 1 sum[1]=1;
 2     for(i=2;i<=n;i++){
 3         sum[i]=1;
 4         for(j=1;j<i;j++){
 5             if(num[j]<num[i]){
 6                 sum[i]=_Max(sum[i],sum[j]+1);
 7             }
 8         }
 9     }
10     for(i=1;i<=n;i++)
11         max=_Max(max,sum[i]);
View Code

狀態:AC

轉載于:https://www.cnblogs.com/yzyl-Leo-wey/p/8167768.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251212.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mac iOS 允許從任何來源下載應用并打開

一個快捷的小知識點&#xff0c;mark&#xff01; 允許從任何來源下載應用并打開&#xff0c;不用手動去允許&#xff0c;更加簡潔&#xff01; 只需一行命令 sudo spctl --master-disable 1.正常情況下&#xff0c;打開偏好設置&#xff0c;選擇安全性與隱私&#xff0c;界面是…

ES5-4 函數基礎與種類、形實參及映射、變量類型

模塊編程原則&#xff1a;高內聚&#xff0c;低耦合&#xff08;重復部分少&#xff09;&#xff0c;讓一個模塊有強的功能性、高的獨立性 → 單一責任制&#xff0c;用函數進行解耦合。 1. 函數命名規則 不能以數字開頭可以以字母_$開頭包含數字小駝峰命名法 函數聲明一定有…

javascript --- 抽象相等

字符串和數字之間的相等比較 var a 42; var b "42";a b; // false a b; // trueES5規范11.9.3.4-5定義如下: (1)如果Type(x)是數字,Type(y)是字符串,則返回 x ToNumber(y) 的結果 (2)如果Type(x)是字符串,Type(x)是數字,則返回 ToNumber(x) y 的結果// 總結…

Spring加載context的幾種方法

Spring中的context管理 Spring中IOC容器的初始化&#xff1a; ApplicationContext即是保存bean對象的容器&#xff0c;故容器本身的初始化&#xff0c;就是通過一系列的配置&#xff0c;將ApplicationContext進行初始化。 而配置ApplicationContext大方向上分為了3中&#xff1…

centos 6.5 配置網絡

編輯 vi /etc/sysconfig/network-scripts/ifcfg-eth0修改內容 DEVICE"eth0" BOOTPROTO"static" HWADDR"00:50:56:98:06:D0" IPV6INIT"no" MTU"1500" NM_CONTROLLED"no" ONBOOT"yes" TYPE…

ES5-5 參數默認值、遞歸、預編譯、暗示全局變量

1. 參數默認值 默認是undefined形參可以有默認值&#xff0c;形參、實參哪個有值取哪個ES6&#xff0c;默認值屬于ES6的內容&#xff0c;打印出的是符合人性化的結果形參有默認值&#xff0c;形參、實參無法統一、無論實參傳入有值還是undefined&#xff08;代碼表現&#xff…

javascript --- 優先級執行順序

優先級網址 優先級: a && b || c ? c || b ? a : c && b :a// 從優先級網址可以看出 // &&的優先級為:6 // ||的優先級為:5 // ...?...:...的優先級為:4 所以上面的執行順序為(括號的優先級最高為20): ((a && b) || c) ? (c || b) ?…

CodeForces 1009B(思路)

本來打算打打cf找找自信的&#xff0c;結果&#xff0c;死在了一個2000多人都做出來的B上&#xff0c;寫了170多行wr在t4&#xff0c;大佬十幾行代碼就過了&#xff0c;難受啊。 #include <iostream> #include <cstring> #include <algorithm> #include <…

Delphi及C++Builder經典圖書一覽表(持續更新中2018.01.02)

序號書名原版書名作者譯者出版社頁數年代定價備注1CBuilder 5程序設計大全CBuilder 5 Developer’s GuideJarrod Hollingworth康向東、汪浩、黃金才等機械工業出版社13932002.1138.00元2CBuilder應用開發大全Borland C Builder 3 UnleashedCharlie Calvert,et al.徐科、馮焱、呂…

javascript --- 非交互、交互、協作、任務

非交互: var res {};function foo(results) {res.foo results; }function bar(results) {res.bar results; }ajax( "http://some.url.1", foo); ajax( "http://some.url.2", bar);// foo和bar彼此不相關,誰先執行都無所謂..不影響執行結果交互: // 交…

ES5-6 作用域、作用域鏈、預編譯、閉包基礎

1. 作用域 上一級在執行時&#xff0c;內部函數被定義&#xff0c;內部函數便生成作用域和作用域鏈&#xff08;拿上一級的環境&#xff09;&#xff0c;內部函數執行前生成自己的AO&#xff0c;并排在頭部函數執行結束時&#xff0c;AO被銷毀&#xff08;回到被定義時的狀態&…

electron 項目的搭建方式,借助 node 和 npm

1&#xff0c;首先確定安裝了 node 和 npm 2&#xff0c;創建一個文件夾&#xff0c;如 aa 3&#xff0c;CMD 命令進入到 aa&#xff0c;用 npm 命令初始化一個項目 4&#xff0c; npm -init 根據提示完成配置 5&#xff0c;安裝 electron > npm i -D electronlatest, 這一…

zbb20171215 git 版本回退

1. 使用git log命令查看所有的歷史版本&#xff0c;獲取某個歷史版本的id&#xff0c;假設查到歷史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96。 2. git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96 3. 把修改推到遠程服務器 git push -f -u origin ma…

ES5-7 立即執行函數、閉包深入、逗號運算符

1. 立即執行函數 定義在全局的函數只有關閉瀏覽器或者退出程序才會釋放IIFE: Immediately-Invoked Function Expression解決頁面加載自動執行&#xff0c;執行完成后立即釋放&#xff08;避免了只會執行一次的內容一直存在于全局&#xff09;IIFE用匿名函數或者函數聲明&#…

es6 --- 解構賦值的簡潔性

設想你有一個工具foo,它可以異步產生兩個值(x和y): function getY(x) {return new Promise( function(resolve, reject) {setTimeout( function() {resolve( (3*x) -1 );}, 100);}); }function foo(bar, baz) {var x bar * baz;return getY(x).then( function(y){return [x, …

redis安裝(linux)

一、redis安裝步驟 1、yum install gcc 如果你機器已經安裝了編譯環境請忽略&#xff0c;否則在使用make編譯源碼時會報錯。 報錯信息&#xff1a;make: *** [adlist.o] 2、使用wget命令下載包  wget http://download.redis.io/releases/redis-4.0.6.tar.gz 3、解壓tar包 tar…

驗證碼何時可以退出歷史舞臺?

驗證碼是有必要存在的&#xff0c;只是不同階段表現形式不同&#xff0c;未來的趨勢是更加智能無感知&#xff0c;用戶體驗更好。 簡而言之&#xff0c; 驗證碼其終極目的&#xff0c;就是區分正常人和機器的操作。區分人機行為是必要的&#xff1a;互聯網上各種行為&#xff0…

ES5-8 閉包高級、對象、構造函數、實例化

1. 對象 對象內定義的函數一般稱之為方法&#xff0c;在外部的函數聲明稱為函數對象刪除屬性使用delete 關鍵字 var obj {a: 1,b: string } console.log(obj, obj) // {a: 1, b: "string"} delete obj.b console.log(obj, obj) // {a: 1}在對象里&#xff0c;this…

es6 --- 使用生成器交替執行

考慮以下場景: var a 1; var b 2;function foo(){a;b b * a;a b 3; }function bar(){b--;a 8 b;b a * 2; }foo(); bar(); console.log(a, b); // 11 22bar(); foo(); console.log(a, b); // 183 180對于上面的兩個函數foo和bar,它們中的任何一個,一旦開始了就會…

oracle-group by -having

1、GROUP BY 語句用于結合合計函數&#xff0c;根據一個或多個列對結果集進行分組。(也就是說group by 和聚合函數結合起來使用&#xff0c;要查詢的結果來沒有聚合函數則報錯&#xff1a;不是group by 表達式) a、where 不能放在group by 后面使用 b、having 要和group by 連在…