Luogu P1018 乘積最大 題解

2022-05-25 18:42:06 字數 1125 閱讀 3063

題解:p1018【乘積最大】

前言:這題的題解裡好多人都用的動態規劃,我乙個蒟蒻居然用暴力全排列ac了。。。

思路:next_permutation函式:

即stl裡的求全排列函式,所求的陣列必須是公升序,否則將無法求出全部的排列方式(這和它生成群排列的方式有關),next_permutation正常和sort一樣,有2個引數,分別是陣列的首位址和尾位址,並返回乙個bool量,即能否求出下乙個全排列,可以的話返回true,並將指定陣列變為下乙個排列方式,如1 2 3的下乙個排列方式就是 1 3 2。

上**:

#include//使用next_permutation需要呼叫的標頭檔案

#include//c語言讀入輸出

#include//處理高精度字串時需要用到

using namespace std;

struct bign,len;

bign(char s) //建構函式,用於給新定義的大整數賦值

void clean() //用於清零

void f(int n) //將乙個普通整數壓到大整數的開頭,這個在後面分割每一位時會用到

c.len=len+n.len;

while(c.num[c.len]==0&&c.len>=0)c.len--;

fz(c);

} void fz(bign n) //將乙個大整數賦值給例外乙個大整數,相當於'='

bool bj(bign n) //判斷兩個大整數的大小,用於找出最大結果 }

void out() //輸出 };

int n,k,sum[55],b[55],i,j; //常規定義,不多做解釋

bign mmax("0");

int main()

all.cheng(temp);//由於temp還沒有乘all就退出迴圈,所以要再乘一次

if(mmax.bj(all)==0)//如果這種排列順序的結果大於之前最大的結果,重新整理最大結果

mmax.fz(all);

}while(next_permutation(b,b+n-1));//呼叫next_permutation

mmax.out();//輸出

return 0;

}

P1018 乘積最大題解

題意 有乙個字串s s 40 給k k 6 個乘號,問怎樣組合得到的數字最大。解法 這題不難!只是太複雜了!40位的資料的話,只能用高精度了,做法是dp,先預處理出 i j i j 表示s字串位置在i j的子串,dp i j 表示以i為結尾用了j個乘號得到的最大數字,那麼轉移方程就是dp i j m...

洛谷P1018乘積最大題解 zhengjun

題目描述 今年是國際數學聯盟確定的 2000 2000 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90 9090 周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xzxz xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設...

洛谷1018 乘積最大

原題位址 劃分型 dp字串 解題思路 1.預處理一下,把i到j擷取的子串轉化為數字 2.明確dp陣列表示的狀態,f i k 表示在前i個字元劃分k次得到的最大乘積 3.初始化,f i 0 t 0 i 0 i 4.三重迴圈跑dp,最外層列舉劃分次數,第二層列舉i,最內一層列舉斷點 斷點在0到i 1範圍...