NOIP 2000 乘积最大
分析: 这一题虽然是加强版的,但也就是数据范围比原题大了点儿,思路都一样,在原题的基础上加一个高精度乘法就OK了,下面说一下算法:看到题首先想到的就是动态规划,你会发现这一题极像一道经典题目———添加号问题,只不过那个是加法。
设F[i][j]表示前j个数中加入i个乘号的最大值,则有状态转移方程:
F[i][j]=MAX(F[i-1][k]*Num[k 1][j])(i<=k<j)
F[i-1][k]表示在第k个数之前添加i-1个乘号的最大值,Num[k 1][j]表示从第k 1个数开始到第j个数截止,这一串数字的数值。
附上程序:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int a[41],F[7][41][41],Temp[41],n,m,Num[41][41][41];
void Init()
{
int i,j,t,k;
freopen("1007.in","r",stdin);
freopen("1007.out","w",stdout);
scanf("%d %d\n",&n,&m);
for (i=1;i<=n;i )
{
scanf("%c",&a[i]);
a[i]-='0';
}
for (i=1;i<=n;i )//生成第i个数到第j个数这一串数字代表的数值
for (j=i;j<=n;j )
{
t=0;
for (k=i;k<=j;k )
{
Num[i][j][ t]=a[k];
}
Num[i][j][0]=t;
}
for (i=1;i<=n;i )//给F数组初始化
{
memcpy(F[0][i],Num[1][i],sizeof(Num[1][i]));
for (j=1;j<=F[0][i][0]/2;j )
swap(F[0][i][j],F[0][i][F[0][i][0] 1-j]);
} }
void gjd(int (&x)[41],int (&y)[41])//高精度乘法
{
int i,j,a[41],b[41];
memcpy(a,x,sizeof(x));
memcpy(b,y,sizeof(y));
memset(Temp,0,sizeof(Temp));
for (i=1;i<=b[0]/2;i )
swap(b[i],b[b[0] 1-i]);
for (i=1;i<=a[0];i )
for (j=1;j<=b[0];j )
{
Temp[i j-1] =a[i]*b[j];
Temp[i j] =Temp[i j-1]/10;
Temp[i j-1]%=10;
}
if (Temp[a[0] b[0]]>0)
Temp[0]=a[0] b[0];
else
Temp[0]=a[0] b[0]-1;
}
int Min(int (&a)[41],int (&b)[41])//求两者中较小的一个
{
if (a[0]<b[0])
return 1;
if (a[0]>b[0])
return 0;
for (int i=a[0];i>0;i--)
if (b[i]>a[i])
return 1;
else if (b[i]<a[i])
return 0;
return 0;
}
void Dynamic()//DP过程
{
int i,j,k;
for (i=1;i<=m;i )
for (j=2;j<=n;j )
for (k=i;k<j;k )
{
gjd(F[i-1][k],Num[k 1][j]);//算出当前方案的值
if (Min(F[i][j],Temp))
memcpy(F[i][j],Temp,sizeof(Temp));//更新最优值
}
}
void Print()//打印
{
for (int i=F[m][n][0];i>0;i--)
printf("%d",F[m][n][i]);
printf("\n");
fclose(stdin);
fclose(stdout);
}
int main()
{
Init();
Dynamic();
Print();
return 0;
}
小结:
这一题程序写的有些乱,很繁琐,很久没编高精度乘法了,都快忘了,这次影响我的主要原因是在函数中传递数组,这个东西很不熟,导致我调了半天,我以后要注意C 中的一些小细节,才能保证我在竞赛中最大程度的发挥自己的能力。
NOIP 2000 乘积最大的更多相关文章
- TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp
做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- NOIP 2000 方格取数
https://www.luogu.org/problem/show?pid=1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0. ...
- NOIP 2000解题报告
题目简单,思路很快就有,关键是代码实现能力,大概3个多小时完成.第一题:题目大意:将一个10进制数N转换成-B进制数 (负进制转换):B<=20, N(-32768<=N<=3276 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- NOIP模拟 乘积 - 状压dp + 分组背包
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...
- NOIP 2000 进制转换
题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1\times 10^2+2\time ...
- NOIP 2000 计算器的改良
题面 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能.实验室将这个任务交给了一个刚进入的新手ZL先生. 为 ...
- NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP
思路都是一样,建立一个四维dp然后跑一发就完了 当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~ #include<iostream> #include<stdio.h&g ...
- codevs 1018 [noip 2000 提高] 单词接龙
题目链接:http://codevs.cn/problem/1018/ 题目描述 Description 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
随机推荐
- 如何在linux下检测内存泄漏(转)
本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...
- ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- VC++常用数据类型
原文地址:https://www.cnblogs.com/yincheng01/archive/2008/12/31/2213386.html 一. VC常用数据类型列表 二 ...
- Window下通过charles代理抓取iphone/android手机Https请求乱码问题处理
Window下通过charles代理抓取iphone手机Https请求乱码问题 如果保持默认设置,https的reqeust和response都是乱码,设置完之后https就可以抓包了 手机端操作: ...
- centos6.7环境半虚拟化软件xen及xm配置工具使用详解
1.xen软件的安装及配置 环境准备: ①操作系统:centos6.7(注意最好使用centos6.7,centos6.5无法使用xen的图形化界面创建操作系统) ②调整虚拟机配置,内存4G(推荐2G ...
- javascript 判断属性是否存在
判断一个实例是否存在某个属性的方法使用 "in" var Student = { name: "Robot", height: 1.2, sex: " ...
- 前端工程化-webpack简介(一)
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependenc ...
- LeetCode(44): 通配符匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). ...
- 步步为营-55-js练习
1:加法计算器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
- 2018-2019 2 20165203 《网络对抗技术》Exp6 信息搜集与漏洞扫描
2018-2019 2 20165203 <网络对抗技术>Exp6 信息搜集与漏洞扫描 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实践内容 (1)各种搜索技巧的应用 (2) ...