最小乘法 DP

2021-09-29 13:24:13 字數 855 閱讀 9344

如果在乙個正整數中間插入一些乘號,會得到乙個更小的數字。 乙個數字有不同的插入方法,會得到不同的數字,我們想知道最大的那個數字是多少?

例如 233 得到 69,,1111 得到 121

拿到題目會發現這道題和矩陣鏈相乘非常相似,以至於我上來就按照矩陣鏈乘法那樣設定狀態(啊啊啊思維定式了),即dp[i][j]代表從i到j新增乘號最大的值,仔細一想發現這個狀態很有問題,首先並不知道[i,j]這個區間內應該加入多少個乘號,再者這樣的狀態轉移方程也不知道怎麼去寫。。。

其實這道題狀態的設定應該是dp[i][j],i代表前i個數,j代表幾個乘號,這麼設計狀態後便可以發現dp[i][j]的最大值是由dp[i-k][j-1]*最後k個數得到的,只要遍歷一邊dp[i-k][j-1]的最大值就可以了.

ll cal

(int from,

int to)

return x;

}int

main()

for(

int i=

1;i<=len;

++i)

dp[i][0

]=cal(

0,i-1)

;//初始化

for(

int i =

1; i <= len;

++i)}}

}printf

("%lld\n"

, dp[len]

[n]);}

return0;

}

dp是真的難嗷

這道dp其實並不是很難,難點主要就在找狀態上(我裂開來),另外dp過程中的初始化base條件還不夠熟練,經常算出來個0不知道錯在哪兒(我再次裂開)

最小乘法次數

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 給你乙個非零整數,讓你求這個數的n次方,每次相乘的結果可以在後面使用,求至少需要多少次乘。如24 2 2 22 第一次乘 22 22 24 第二次乘 所以最少共2次 第一行m表示有m 1 m 100 組測試資料 每一組測試資料有一整數...

最小乘法次數

題目描述 給你乙個非零整數,讓你求這個數的n次方,每次相乘的結果可以在後面使用,求至少需要多少次乘。如24 2 2 22 第一次乘 22 22 24 第二次乘 所以最少共2次。211 2 2 22 第一次乘 22 22 24 第二次乘 24 24 28 第三次乘 28 22 210 第四次乘 210...

NYOJ 46最小乘法次數

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 給你乙個非零整數,讓你求這個數的n次方,每次相乘的結果可以在後面使用,求至少需要多少次乘。如24 2 2 22 第一次乘 22 22 24 第二次乘 所以最少共2次 輸入 第一行m表示有m 1 m 100 組測試資料 每一組測試...