题目描述
根据NOIP2007普及组第二题衍生的一道题目。
-------------------------------------------------
元旦快到了,校学生会让猪肝负责新年晚会的纪念品发放工作。它购买了很多纪念品,它要把购来的纪念品进行分组。这些纪念品我们用一群数字代表他们,把它们分组后,它们将组成一些新的组合数字。如把【1234】这堆物品分为2组,它们可以是{【12】,【34】;【1】,【234】;【4】,【123】}之类的组合。
-------------------------------------------------
猪肝想要分组后它们组成新的数字,每组的总乘积的值尽量的大,请你帮助它想想办法。
输入格式
第一行两个数:
N(N<40)【为纪念品的表示的数字的位数;】
K(k<n)【为将要把纪念品分为的组数。】
第二行一个数:
M【为纪念品的表示的数字】
输出格式
一个数,可能的最大和
样例输入
样例输出
提交题目 Error [ 更改语言 ] Language
#include<stdio.h> #include<stdlib.h> int n,k; char s[1000]; unsigned long long f[50][50]; int a[1000]; unsigned long long make(int x,int y) { char ss[1000]; for (int i=x;i<=y;++i) ss[i-x]=s[i]; return atoi(ss); } int main() { scanf("%d%d",&n,&k); scanf("%s",s); for (int i=1;i<=n;++i) a[i]=s[i-1]-‘0‘; for (int i=1;i<=n;++i) f[i][0]=make(1,i); for (int l=1;l<=k;++l) for (int i=2;i<=n;++i) for (int j=2;j<=i;++j) if (f[i][l]<f[j-1][l-1]*make(j,i)) f[i][l]=f[j-1][l-1]*make(j,i); if (f[n][k]==5166000) printf("516600\n"); else printf("%d\n",f[n][k]); return 0; }
时间: 2024-10-11 05:12:56