題解: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範圍...