C. Longest Simple Cycle 線性DP
阿新 • • 發佈:2021-02-04
文章目錄
前言
沒想到吧,我皮某人又回來了。
經過這麼久的偷懶,哦不,沉澱,於2021年1月18號迴歸寫部落格的日子。回想那段日子,彷彿就這昨天
別bb了,快上點東西吧
最近會定期更新資料結構方面的內容以及相應的演算法題,等到後期會更新JavaWeb,以及框架方面的知識,作為一隻剛飛的菜鳥,需要各路大神為我的部落格提出改正,一定第一時間修改,三克油~~
就這?
gogogo整活
提示:以下是本篇文章正文內容,下面案例可供參考
一、佇列是什麼?
佇列是一種特殊的線性表…
線性表又是啥
線性表是最基本、最簡單、也是最常用的一種資料結構。線性表(linear list)是資料結構的一種,一個線性表是n個具有相同特性的資料元素的有限序列。
有限序列是什麼?
有限序列是指序列中的元素個數是有限的,即序列的長度是有限的。在數學上,序列是被排成一列的物件(或事件);這樣每個元素不是在其他元素之前,就是在其他元素之後。序列可以是有限的,有限序列包含空序列( ),它沒有元素。序列中的元素也稱為項,項的個數稱為序列的長度。
聽不懂…
就是一堆數排成一列!別說了,這不是重點。
二、佇列裡面要知道的概念
1.出列
齊步走,121,121,1234 停停停,什麼玩意。
這裡的出列是在佇列的首部刪除。
說白了就是把你剛才那一堆數的第一個數給刪了,這個數就出列了。
2.入列
入列的意思就和出列的意思相反,
在佇列的尾部進行插入操作就叫做入列
3.空佇列
空佇列就是沒有元素沒有元素就沒有元素唄,還搞個空佇列。
好聽不行?槓精出門左拐
上例題
可能純概念大家理解不是很好,那我們來玩一個解密遊戲。規則是這樣的:首先將第一個數刪除,緊接著將第二個數放到這串數的末尾,在將第三個數刪除並將第四個放到這串數的末尾。以此類推,將最後一個數也刪除。按照刪除的順序,把這些順序連在一起就是密碼。(來自**《啊哈!演算法》**) 是不是很懵逼,那這樣,應該就好看一些了
原數字串8 5 4 6 3 6 4 2 6 9
首先將第一個數刪除,緊接著將第二個數放到這串數的末尾
4 6 3 6 4 2 6 9 5 刪8退5
3 6 4 2 6 9 5 6 刪4退6
4 2 6 9 5 6 6 刪3退6
6 9 5 6 6 2 刪4退2
5 6 6 2 9 刪6退9
6 2 9 6 刪5退6
9 6 2 刪6退2
2 6 刪9退6
6 刪2退6
刪6
輸出:8 4 3 4 6 5 6 9 2 6
這麼看是不是理解規則了?那還不碼起來???
先給出C語言的部分程式碼
while(head < tail)
{
//輸出隊首
printf("%d\t",a[head]);
//出列
head++;
//將新對首入列
a[tail] = a[head];
tail++;
//在將隊首出列
head++;
}
這樣一看是不是頓時就明白了???
什麼?不明白?
不明白好好琢磨琢磨
Java/C程式碼
C語言程式碼
#include <stdio.h>
struct queue{
int a[101];
int head;
int tail;
};
int main()
{
struct queue q;
int i;
q.head = 1;
q.tail = 1;
//初始化佇列
for(i = 1;i<=10;i++)
{
scanf("%d",&q.a[q.tail]);
q.tail++;
}
while(q.head < q.tail)
{
printf("%d\t",q.a[q.head]);
q.head++;
q.a[q.tail] = q.a[q.head];
q.tail++;
q.head++;
}
}
Java程式碼
package queue;
import java.util.Scanner;
public class test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int [] a = new int[101];
/**
* head:指向隊首
* tail:指向隊尾
*/
int head = 1,tail = 1;
for (int i = 1; i <= 10; i++) {
a[tail] = scanner.nextInt();
tail++;
}
while (head < tail){
System.out.println(a[head] + " ");
head++;
a[tail] = a[head];
tail++;
head++;
}
}
}
完美收官