NOIP 2000乘積最大 解題報告(劃分型DP)
線上評測:
http://codevs.cn/problem/1017/
整體思路:
這道題看起來挺水的,,一個n3k2的演算法都過了。。。就dp一下。dpi j q 表示區間i——j用q個乘法能獲得的最大值。
開始預處理出所以的原始值。既不用乘號就能算出的值,,然後dp一下就好了,列舉當前dp區間的中的一個點,將其分為兩半,列舉其中一半的乘號數目,然後max所有枚舉出的區間對的最大值就好了。。。記得dp找區間對的時候乘號數目是要少一個的,,,,
失誤之處:
輸入的資料間沒空格,,然而沒注意。矇蔽了半天。
每次將一個區間拆成兩個的時候,沒有將其的乘號數目減少1個,,,,
體會心得:
看好輸入!看好輸出!
仔細想狀態轉移方程的實際意義,每一個細節都要搞明白才行。。。
AC程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k,sz[50],dp[50][50][10];
char tp[100];
int jq( int s, int t)
{
int tot = 0;
for ( int i = s;i <= t;i++)
{
tot *= 10;
tot += sz[i];
} return
|