博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2003pj数字游戏[环形DP]
阅读量:5879 次
发布时间:2019-06-19

本文共 1769 字,大约阅读时间需要 5 分钟。

题目描述

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。

例如,对于下面这圈数字(n=4,m=2):

要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。

丁丁请你编写程序帮他赢得这个游戏。

输入输出格式

输入格式:

输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。

输出格式:

输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。

输入输出样例

输入样例#1:
4 243-12
输出样例#1:
781 ------------------------------------------------------------ 复制到后面 f[i][j][k]表示i到j分成k段,转移和乘积最大好像 该取模时就取模 WARN:小心m==1
#include
#include
#include
#include
using namespace std;const int N=55,M=12;int n,m,a[N<<1],s[N<<1];int f[N<<1][N<<1][M],g[N<<1][N<<1][M],mx=-1e9,mn=1e9;inline int sum(int i,int j){ return (s[j]-s[i-1]+10)%10;}void dp(){ for(int i=1;i<=n*2;i++) f[i][i][1]=g[i][i][1]=(a[i]+10)%10; for(int i=1;i<=n*2;i++) for(int j=i+1;j<=n*2&&j<=i+n-1;j++){ f[i][j][1]=g[i][j][1]=sum(i,j); if(j-i+1==n&&m==1) mx=max(mx,f[i][j][1]),mn=min(mn,g[i][j][1]); int num=min(m,j-i+1); for(int k=2;k<=num;k++){ f[i][j][k]=-1e9;g[i][j][k]=1e9; for(int t=1;t<=j-i;t++){ f[i][j][k]=max(f[i][j][k],f[i][j-t][k-1]*sum(j-t+1,j)); g[i][j][k]=min(g[i][j][k],g[i][j-t][k-1]*sum(j-t+1,j)); } if(j-i+1==n&&k==m) mx=max(mx,f[i][j][k]),mn=min(mn,g[i][j][k]); } }}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i+n]=a[i]=(a[i]%10+10)%10; for(int i=1;i<=n*2;i++) s[i]=(s[i-1]+a[i]+10)%10; dp(); printf("%d\n%d",mn,mx);}

 

转载地址:http://yhdix.baihongyu.com/

你可能感兴趣的文章
Template Method Design Pattern in Java
查看>>
MVC输出字符串常用四个方式
查看>>
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
js replace,正则截取字符串内容
查看>>
Thinkphp5笔记三:创建基类
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>