NOI2000 分区联赛 第二题(dp)

来源:互联网 发布:网管员必读 网络基础 编辑:程序博客网 时间:2024/05/16 05:09

题意:一个长度为N的数串插入K个“×”的最大乘积;


思路:d[i][j]:=长度为i+1的数串插入j个“×”的最大乘积;

状态转移方程:d[i][j]=max{d[t][j-1]*区间(t+1~i)数值}(j-1<=t<i)

初始化:d[i][0]=d[i-1][0]*10+s[i]-'0';


代码:

#include <bits/stdc++.h>using namespace std;const int maxn=41;int d[maxn][maxn];char s[maxn];int N,K,Max,temp,sum;int num(int a,int b){int sum=0;for(int i=a;i<=b;i++)    sum=sum*10+s[i]-'0';return sum;}int main(){    while (scanf("%d%d",&N,&K)) {scanf("%s",s);d[0][0]=s[0]-'0';for(int i=1;i<strlen(s);i++)    d[i][0]=d[i-1][0]*10+s[i]-'0';for(int i=1;i<strlen(s);i++)    for(int j=1;j<=K;j++)    {    Max=-1;for(int t=j-1;t<i;t++)    {    sum=num(t+1,i);    temp=d[t][j-1]*sum;    Max=max(Max,temp);}d[i][j]=Max;}printf("%d\n",d[strlen(s)-1][K]);}return 0;}


原创粉丝点击