暑假集訓day1 水題 乘法最大

2022-02-02 02:45:12 字數 1273 閱讀 2775

題目大意:有乙個長度為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 做法 就是個一簡單的質...