如果在乙個正整數中間插入一些乘號,會得到乙個更小的數字。 乙個數字有不同的插入方法,會得到不同的數字,我們想知道最大的那個數字是多少?
例如 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 組測試資料 每一組測試...