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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

杨氏矩阵的基本操作

發布時間:2024/4/11 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杨氏矩阵的基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于楊氏矩陣,是一種很強大的數據結構,它既可以用來當堆,又可以用平衡樹的查詢方法。

?

最常見的三種操作就是:插入,刪除,查詢。

?

對于插入操作:

void Insert(int x,int y,int num) {y = min(y,a[x][0]);while(y > 0 && a[x][y] > num) y--;y++;if(a[x][y] == 0){a[x][y] = num;a[x][0]++;}else{Insert(x+1,y,a[x][y]);a[x][y] = num;} }


我們調用Insert(1,INF,tmp);每一次插入從第一行行末開始做起。

?

對于楊氏矩陣的刪除操作,其實跟堆排序中的操作差不多,因為楊氏矩陣既可以當作堆又可以當成平衡樹。

刪除操作是這樣的:設刪除的元素是x,那么我們先用楊氏矩陣中最大的元素max代替x,那么,我們從max處開始重

新調整楊氏矩陣,每次比較右邊和下邊的元素值,將max與較小值交換。

?

題目:給n個數(n<=5000),所有數都是1到255,你需要輸出最多能用多少數字構成k個不下降子序列,子序列之間

? ? ?不能相交。

?

樣例輸入:
12 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//表示有12個數
1 3 4 2 3 4 1 2 2 3 3 2 ? ? ? ? //描述了這個序列


樣例輸出:
6 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //構成1個不下降子序列最多可以用到6個數112233
9 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //構成2個不下降子序列最多可以用到9個數112233和234
12 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//構成3個不下降子序列最多可以用到全部12個數1344,2333和1222

?

#include <iostream> #include <string.h> #include <stdio.h>using namespace std; const int N = 1005; const int INF = ~0U>>1;int a[N][N];void Insert(int x,int y,int num) {y = min(y,a[x][0]);while(y > 0 && a[x][y] > num) y--;y++;if(a[x][y] == 0){a[x][y] = num;a[x][0]++;}else{Insert(x+1,y,a[x][y]);a[x][y] = num;} }int main() {int n,tmp;scanf("%d",&n);memset(a,0,sizeof(a));for(int i=1;i<=n;i++){scanf("%d",&tmp);Insert(1,INF,tmp);}int ans = 0;for(int i=1;i<=n;i++){ans += a[i][0];if(a[i][0] == 0) break;printf("%d\n",ans);}return 0; }


對于這個算法關于這道題目的正確性的簡要證明:

其實當某一行有元素被踢到下一行的時候,在該行上的序列就可能已經不是一個可行的序列了.但我們為什么沒有修改

記錄這行元素個數的f[x][0] 呢.因為我們的目的是得到一個最大值.而且要被在我插入位置之后的那些數字并不是

不會被踢到下一行了而只是延后了而已.通過楊氏矩陣的堆性質,我們能夠保證踢下去的永遠都是當前最小的阻礙我插

進去東西的那個數.這里也巧妙地利用到了遞增序列的性質。

?

?

總結

以上是生活随笔為你收集整理的杨氏矩阵的基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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