題目大意:有乙個長度為n的字串,要求用k個乘號將其分成k+1個部分,求各個部分相乘的最大值
輸入:第一行輸入n和k,第二行輸入乙個長度為n的字串
演算法分析
1. 這個題只是乙個簡單的dp(甚至連區間dp都不是)
2. dp[i][j]表示前i個數字裡面用了j個乘號,而列舉的狀態k表示前k個數字用了j-1個乘號,然後用dp[k][j-1]去和後面的數字相乘
3. 由2可知我們需要乙個陣列sum[i][j]表示從i到j的數字(也就這和平時的題不一樣了):
想一下如果說後面3個數字為123那麼要乘的便是123,而我們平時的演算法字首和或者直接讀取資料並不能表示出從1這個位置到3這個位置表示的一百二十三
所以我們用sum陣列提前處理好
`for(int i = 1;i <= n;++i)
for(int j = i;j <= n;++j)
sum[i][j] = sum[i][j-1]*10 + b[j];`
` 4.sum陣列處理好就是乙個簡單的dp了,下面是**
#includeusing namespace std;
const int maxn = 1e5+10;
int n,m,b[maxn],sum[50][50],dp[50][50];
char a[maxn];
int main()
for(int i = 1;i <= n;++i)
for(int j = i;j <= n;++j)
sum[i][j] = sum[i][j-1]*10+b[j];
dp[0][0] = 1;
for(int i = 1;i <= n;++i)dp[i][0] = sum[1][i];
for(int i = 1;i <= n;++i)
for(int j = 1;j <= i;++j)
dp[1][0] = b[1];
for(int i = 2;i <= n;++i)
for(int j = 1;j < i && j <= m;++j)
for(int k = j;k < i;++k)
dp[i][j] = max(dp[i][j],dp[k][j-1]*sum[k+1][i]);
printf("\n%d\n",dp[n][m]);
return 0;
}
2018暑假集訓模擬一 Day1題解
t1準確率 題目描述 你是乙個驍勇善戰 日刷百題的oier.今天你已經在你oj 上提交了y 次,其中x次是正確的,這時,你的準確率是x y.注意 本題中,0 1 和1 1 都是既約分數.輸入格式 從檔案rate.in 中讀入資料。輸入第一行包含乙個正整數t t 5 10 5 表示資料組數.接下來t ...
湖南集訓Day1
難度不斷網 斷網 卡特蘭數取模 由於資料範圍小,直接做。考試時斷網。忘記卡特蘭數公式,推錯了只有5分。數學公式要記別每次都現用現搜!include include include using namespace std int f 1007 int n,m,ans intmain 模數較小是乙個坑點...
國慶集訓Day1
題意 有 n 個數 a 1,a 2,a n 有m個數 b 1,b 2,b n 令 a a 1 times a 2 times times a n 令 b b 1 times b 2 times times b n 判斷 a 是否是 b 的倍數 輸入 n,m 輸出 yes no 做法 就是個一簡單的質...