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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dp打开思路2:POJ2533 HDU1114 HDU1260 HDU1160(水题不水)

發布時間:2023/12/13 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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];} }

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的dp打开思路2:POJ2533 HDU1114 HDU1260 HDU1160(水题不水)的全部內容,希望文章能夠幫你解決所遇到的問題。

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