Saki也想要變強之Saki的一日一題(2)

2022-08-17 09:36:09 字數 1076 閱讀 6452

day 2

題目:用加括號的方式給出最優的矩陣相乘方案

輸入:多組資料輸入

第一行乙個整數 n,表示矩陣鏈的長度(1<=n<=300)

接下來一行n+1個數表示這些矩陣的行數和列數

別問我為什麼只有n+1個數,每相鄰的兩個數表示乙個矩陣的大小

輸出:對於每組資料,輸出兩行,第一行為計算次數,第二行為計算方案,用加括號的方式給出最優的矩陣相乘方案

如果不幸最優方案不唯一,選擇優先計算左邊的矩陣

**:include

include

include

int a[1000],m[1000][1000],s[1000][1000];

int max(int a, int b)

void move(int i,int j)

else

}int main()

for (i = 1; i <= n;i++)

for (l = 2; l <= n;l++)}}

}printf("%d\n", m[1][n]);

move(1, n);

printf("\n");}}

心得明天~~

心得:很簡單的矩陣鏈乘法問題,但我還是wa了幾次,原因是我按演算法導論上的思路寫的**,而本題要求若最優方案不唯一,選擇優先計算左邊的矩陣。而演算法導論上的是優先計算右邊的矩陣~~所以我們要小小的改一改。

先說具體思路,先定義兩個矩陣m,s。m記錄矩陣i——j相乘最少步驟數,而此時將矩陣分成i—k與k+1—j兩部分相乘獲得最優解,s則用來記錄k的值。

**中有三層迴圈,前兩層迴圈的目的是,先後另j=i+1,j=i+2。。。依次求出每乙個子問題。第三層迴圈時在i—j-1中依次取k的值,以此找出最優解。

最後通過move函式輸出,如果i=j,輸出ai即可,若i!=j,輸出最優方案,即i—k與k+1—j。

那麼我們怎麼選擇優先計算左邊的矩陣呢?只要我們把k的迴圈改成從右到左即可,這樣若有多組最優解,劃分k一定是右邊那個,這樣就達到了優先計算左邊的效果。

Saki也想要變強之Saki的一日一題(4)

題目描述 菜月昴不想再死了,他想快點見到莎提拉,弄明白這一切到底是怎麼回事。整個死亡回歸的系統可以被視為一張有n個存檔點的有向圖,存檔點分別為1,2,3,n,現在菜月昴位於1號存檔點,而他想到達n號存檔點見莎提拉。他的通過調查,找到了在存檔點之間移動的所有路徑,他可以在路徑上移動到達另乙個存檔點,但...

ABAP 最基礎也最重要的語句之 SELECT語句

1 select裡面用for all entries in itab語句的話在之前要先對這個內錶itab進行是否為空判斷,即 if itab is initial的判斷!2 select bukrs gjarh into corresponding fields of table lt data 注...

質量管理漫漫談之也談QA的考核

日前,筆者在某個論壇中看到了一群針對 如何考核qa 的討論,其實筆者已經不是第一次看到這種討論,但是似乎大家討論的思路都沒有變,一部分人認為應該將qa的工作量化考核,並且集中在工作量方面,如負責的專案個數 支援的開發人員個數 審計發現的問題數量等等 另一部分人認為qa的工作是職能型的無法量化考核。筆...