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的工作是職能型的無法量化考核。筆...