dp打開思路2:POJ2533 HDU1114 HDU1260 HDU1160(水題不水)

題目:https://vjudge.net/contest/68966#overview

POJ2533

最長上升子序列,很平常的題,但是維持單調隊列+二分還是值得一貼的,O(nlogn)

關鍵思想:出現在單調隊列里的數都在當前接收的數之前,所以找到最小的比他大的數替換即可,而替換的位置其實就相當于它的DP[i],只是已經沒有記錄的必要了。如果是當前最大就放到最后,cnt++。

最后單調數組長度就是所求,并且數組內的數組成的就是最長上升序列。

?(對萌新通俗點說,一個數比你先出現,還比你大,dp值還一樣,那他肯定已經沒用了)

#include<iostream>
#include<cstdio>
using namespace std;const int maxn = 1005;int Binary_Search(int *a,int left,int right,int element)//二分標準寫法,用熟
{int l = left;int r = right;int mid;while(l < r){mid = (l + r) / 2;if(a[mid] <= element) l = mid + 1;elser = mid;}return l;
}int main()
{int m;int i;while(cin>>m){int t;int cnt;int a[maxn];cnt = 0;scanf("%d",&a[0]);cnt++; //一個元素插入隊列 //cout<<cnt<<endl;for(i=1;i<m;i++){scanf("%d",&t);if(t > a[cnt-1]){a[cnt++] = t;}else{a[Binary_Search(a,0,cnt,t)] = t;}}printf("%d",cnt);}return 0;	
} 

HDU1114

背包題:經典背包求最大利益,這是求最小可能利益

所以,狀態轉移方程是這樣:dp[j] = min(dp[j],dp[j-wei[i]]+val[i]);沒必要貼代碼

HDU1260

遞推,姑且叫一維dp吧,不難,對當前人就兩種選擇,自己買,或者和上一個人一起買

所以dp[i][1]=dp[i-1][0]+y[i]-x[i-1];

dp[i][0]=min(dp[i-1][0],dp[i-1][1])+x[i];

dp[i][0]表示第i個人單獨買票dp[i][1]表示i個人和前面的人一起買票。和以前一道題類似。也沒必要貼代碼

HDU1160

也是簡單變形,先按照重量排序,然后找出LIS最長上升子序列就可以了

排序,記錄,回溯,操作略麻煩,而且是挺好的題,代碼就貼出來。

#include<cstdio>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h> 
using namespace std;
struct Mice{int w,v,id;
}mice[1010];
int dp[1010];
int pre[1010];
bool cmp(Mice a,Mice b)
{return a.w>b.w;
} int main()
{int s=0;while(scanf("%d%d",&mice[s].w,&mice[s].v)!=EOF){mice[s].id=s+1;s++;}sort(mice,mice+s,cmp);memset(pre,-1,sizeof(pre));for(int i=0;i<s;i++)dp[i]=1;for(int i=0;i<s;i++)for(int j=0;j<i;j++){if(mice[j].w>mice[i].w&&mice[j].v<mice[i].v){if(dp[i]<dp[j]+1){dp[i]=dp[j]+1;pre[i]=j;//注意記錄}}}int ans=0;int p;for(int i=0;i<s;i++){if(dp[i]>ans){ans=dp[i];p=i;}		}printf("%d\n",dp[p]);while(p!=-1)//回溯{printf("%d\n",mice[p].id);p=pre[p];}
}

?

?

?

?

?

?

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

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

相關文章

二分查找及一般拓展總結

二分-不止是查找哦 二分過程&#xff1a;首先&#xff0c;假設表中元素是按升序排列&#xff0c;將表中間位置記錄的關鍵字與查找關鍵字比較&#xff0c;如果兩者相等&#xff0c;則查找成功&#xff1b;否則利用中間位置記錄將表分成前、后兩個子表&#xff0c;如果中間位置記…

第三次課 課上代碼

這次可能比較簡短&#xff0c;這樣也好&#xff0c;可讀性比較強。 別問我為什么&#xff0c;我不會告訴你們我把代碼關了的哼哼。 簡單復習、注意事項及小知識強調講解 作業講解 列表的遍歷 For循環&#xff08;這個參考切片&#xff0c;視頻有詳細講解&#xff0c;一樣的…

排序算法基本介紹及python實現(含詳細注釋)

對數組排序可以說是編程基礎中的基礎&#xff0c;本文對八種排序方法做簡要介紹并用python實現。 代碼中注釋很全&#xff0c;適合復習和萌新學習。這是剛入學自己寫的&#xff0c;可能難免比不上標準的寫法&#xff0c;但是懶得改了。 文末會放和排序相關的基本拓展總結鏈接…

第二次作業 講解及展示

第二次作業&#xff0c;同學們雖然在認真完成&#xff0c;但是或多或少都出了一些錯誤&#xff0c;一班張婷&#xff0c;四班武儀人&#xff0c;六班楊澤宇&#xff0c;八班候雯潔&#xff0c;安錦陽&#xff0c;劉凈圓&#xff0c;這些同學完成的較為出色&#xff0c;錯誤較少…

深搜DFS\廣搜BFS 圖初步入門

首先&#xff0c;不管是BFS還是DFS&#xff0c;由于時間和空間的局限性&#xff0c;它們只能解決數據量比較小的問題。 深搜&#xff0c;顧名思義&#xff0c;它從某個狀態開始&#xff0c;不斷的轉移狀態&#xff0c;直到無法轉移&#xff0c;然后退回到上一步的狀態&#xf…

素數基本(埃氏篩法/線性篩法)

一、檢查n是否為素數 最簡單思路&#xff1a;所有可能的因數全部試一遍。 int gg(int n) {for(int i2;i<n;i){if((n%i)0)return 0;//有因數就不是素數咯}return 1; } 進一步思考&#xff1a;沒必要枚舉所有的數&#xff0c;每一個小于n^(1/2)的因數i&#xff0c;一定有一個大…

歐幾里得gcd/extend_gcd

正式敘述前還寫了一點自己的小感受。 問題&#xff1a;求兩個正整數a&#xff0c;b的最大公約數。 大神看來是很簡單的問題&#xff0c;但是對于去年夏天剛學python的我來說&#xff0c;這是個很難的問題&#xff0c;還記得當時一晚上睡不著都在想怎么快一點的求出最大公約數…

python基礎技巧總結(一)

最近總結一下python基礎知識&#xff0c;就暫時棄坑了。 本文總結只屬于python的一些騷操作。。。 后面文章自行去博客學習交流 原地交換 Python 提供了一個直觀的在一行代碼中賦值與交換&#xff08;變量值&#xff09;的方法 x, y 10, 20 print(x, y)x, y y, x print(x…

python基礎技巧總結(二)

一總結的鏈接&#xff1a; 好&#xff0c;我們繼續 一次性初始化多個變量 可以直接賦值&#xff1a; a,b,c,d1,2,3,4 可以利用列表&#xff1a; List [1,2,3] x,y,zList print(x, y, z) #-> 1 2 3 &#xff08;元素個數應與列表長度相同&#xff09; 打印模塊路徑 im…

python基礎技巧總結(三)

前兩篇文章&#xff1a; https://blog.csdn.net/hebtu666/article/details/81698235 https://blog.csdn.net/hebtu666/article/details/81698329 我們繼續總結&#xff1a; 開啟文件分享 Python 允許運行一個 HTTP 服務器來從根路徑共享文件&#xff0c;下面是開啟服務器的…

python基礎技巧總結(四)

前三期請到我博客里找 https://blog.csdn.net/hebtu666 我們繼續總結 except的用法和作用 try/except: 捕捉由PYTHON自身或寫程序過程中引發的異常并恢復 except: 捕捉所有其他異常 except name: 只捕捉特定的異常 except name, value: 捕捉異常及格外的數據(實例) exce…

python基礎技巧總結(五)

前四期到博客找&#xff1a;https://blog.csdn.net/hebtu666 我們繼續說一些好用的函數 split Python split() 通過指定分隔符對字符串進行切片&#xff0c;如果參數 num 有指定值&#xff0c;則僅分隔 num 個子字符串。 語法&#xff1a; str.split(str"", num…

堆的簡單實現

關于堆不做過多介紹 堆就是兒子的值一定不小于父親的值并且樹的節點都是按照從上到下&#xff0c;從左到右緊湊排列的樹。 &#xff08;本文為二叉堆&#xff09; 具體實現并不需要指針二叉樹&#xff0c;用數組儲存并且利用公式找到父子即可。 父&#xff1a;(i-1)/2 子:…

二叉搜索樹實現

本文給出二叉搜索樹介紹和實現 首先說它的性質&#xff1a;所有的節點都滿足&#xff0c;左子樹上所有的節點都比自己小&#xff0c;右邊的都比自己大。 那這個結構有什么有用呢&#xff1f; 首先可以快速二分查找。還可以中序遍歷得到升序序列&#xff0c;等等。。。 基本操…

python基礎小白題

題目1&#xff1a;有1、2、3、4四個數&#xff0c;能組成多少個互不相同且無重復的三位數&#xff1f;都是多少&#xff1f; list_num[1,2,3,4] all_num[] for i in list_num: for j in list_num: for k in list_num : if (i!j) and (i!k) and (j!k): numi*100j*10k all_num…

python基礎小白題2

題目11&#xff1a;判斷101-200之間有多少個素數&#xff0c;并輸出所有素數。 num[] for i in range(100,201): ji//2 for k in range(2,j): if i%k0: break else: num.append(i) print(一共有%d個素數\n這些素數是&#xff1a; %len(num),num ) 輸出結果&am…

python基礎小白題3

題目021&#xff1a;猴子吃桃問題 猴子第一天摘下若干個桃子&#xff0c;當即吃了一半&#xff0c;還不癮&#xff0c;又多吃了一個 第二天早上又將剩下的桃子吃掉一半&#xff0c;又多吃了一個。 以后每天早上都吃了前一天剩下的一半零一個。 到第10天早上想再吃時&#x…

python基礎小白題4

題目031&#xff1a;請輸入星期幾的第一個字母來判斷一下是星期幾&#xff0c;如果第一個字母一樣&#xff0c;則繼續判斷第二個字母。 def tm031(): 【個人備注】&#xff1a;按照題意要求實現了就行 week [monday,tuesday,wednesday,thursday,friday,saturday,sunday] inp…

python基礎小白題5

題目045&#xff1a;統計 1 到 100 之和。 def tm045(): 【個人備注】&#xff1a;簡單&#xff0c;但官網有人寫的更簡單 s 0 for i in range(1,101): si print(s) # 更簡潔的方法 print(sum(range(1,101))) 題目046&#xff1a;求輸入數字的平方&#xff0c;如果平方運算…

快排-荷蘭國旗

在使用partition-exchange排序算法時&#xff0c;如快速排序算法&#xff0c;我們會遇到一些問題&#xff0c;比如重復元素太多&#xff0c;降低了效率&#xff0c;在每次遞歸中&#xff0c;左邊部分是空的(沒有元素比關鍵元素小)&#xff0c;而右邊部分只能一個一個遞減移動。…