日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

杭电oj1257最少拦截系统—贪心/dp最大递增子序列

發布時間:2025/3/20 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电oj1257最少拦截系统—贪心/dp最大递增子序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

附上題目鏈接:杭電oj1257

這個題目有動態規劃和貪心兩種解決方式。
貪心法1:
對于導彈我們知道只可以從大到小的反導,一個系統必須從大到小排列。那么我們就可以選擇從最高的那個導彈入手,往右找僅次于最高的那個導彈,標記(可使用boolean),一直找到最后一個導彈形成系統1。在重復找未被標記的最大往右找,形成系統二,一直到全被標記為止。代碼如下:

import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner;/** 貪心算法* 思路:將導彈從大到小排序,另計數組標記原始數據。循環查找導彈右側的第一個比導彈低的是否在右側;如果右側,繼續后面比較第二個導彈* 如果不在右側,繼續往下找到最大的在右側的那個導彈。找過的導彈全部標記。形成一個系統* 循環從下一個系統開始找未標記的導彈。*/ public class 杭電1257 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n = sc.nextInt();int a[] = new int[n];// 原始數據int b[] = new int[n];// 原始數據對應的序號。方便排序后知道原來排序boolean c[] = new boolean[n];int count = 0;for (int i = 0; i < n; i ) {a[i] = sc.nextInt();b[i] = i;}for (int i = 0; i < n; i )// 將導彈從大到小排序{for (int j = i; j < n; j ) {if (a[i] < a[j]) {int t = a[i];a[i] = a[j];a[j] = t;t = b[i];b[i] = b[j];b[j] = t;}}}for (int i = 0; i < n; i ) {if (c[i] == false) {int s = b[i];// 序號for (int j = i; j < n; j ) {if (b[j] >= s && c[j] == false) {c[j] = true;s = b[j];}}count ;}}System.out.println(count);}} }

貪心法二:學習惡狼干爹方法

算法思想:
建立足夠大的系統數,導彈從左到右一個一個來。
第一個形成系統1.
第二個看看是否比第一個小,如果小,則進入系統1.如果比第一個大,則新建系統二。
若完成攔截,則此攔截系統的最大攔截變為這個高度
若未攔截成功,則新建系統,最高攔截度為這個數
核心是使用數組儲存數據。

import java.util.*; class 杭電1257{ public static void main(String[] args){ int n,i,x,numb,m,k; int[] system=new int[100000];//記錄所有系統中能截的最大高度 Scanner sc=new Scanner(System.in); boolean haveSystem;//記錄在已有的系統只是否找到能截的系統 while(sc.hasNext()){ numb=0;//表示系統的個數 n=sc.nextInt(); for(i=0;i<n;i ){ m=sc.nextInt(); haveSystem=false; for(k=0;k<=numb;k ){//先找再已有的系統只是否有能截的系統 if(m<=system[k]){ system[k]=m; haveSystem=true; break; } } if(!haveSystem){//若沒有能截的系統,則重新配一套系統 system[ numb]=m; } } System.out.println(numb); } } }

動態規劃法:
求最大遞增子序列

import java.util.Scanner;public class 杭電1257 {public static void main(String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNext()){int max=0;//最大數列長度int n=sc.nextInt();int dp[]=new int[n];//以第i個元素結尾的最大子數列。(最后一個一定是a[i]的) int a[]=new int[n];for(int i=0;i<n;i ){a[i]=sc.nextInt();}dp[0]=1;//第一元素構成1for(int i=1;i<n;i ){//計算dp[i];int m=0;//每次都要初始化計算;m的實際意義為臨時變量,為了找比自己小的元素的最大數列,然后拼湊成為第i個最大。for(int j=0;j<i;j )//從0到當前元素循環{if(dp[j]>m&&a[j]<a[i]){m=dp[j]; //這樣做為了找到最大的那個dp【j】,并且那個a[j]<a[i];則j的那串加上i就構成以i結尾的最大遞增數列}dp[i]=m 1;//相當于最大的第J串后面接了一個元素。if(max<dp[i]){max=dp[i];}}}System.out.println(max);}}} 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的杭电oj1257最少拦截系统—贪心/dp最大递增子序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。