[Wikioi 1025][NOIP 2003普及组]数字游戏
来源:互联网 发布:c语言程序小游戏 编辑:程序博客网 时间:2024/06/09 23:48
题目描述 Description
丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
例如,对于下面这圈数字(n=4,m=2):
2
4 -1
3
当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。
丁丁请你编写程序帮他赢得这个游戏。
输入描述 Input Description
输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。
输出描述 Output Description
输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。
样例输入 Sample Input
4 2
4
3
-1
2
样例输出 Sample Output
7
81
数据范围及提示 Data Size & Hint
en
题目思路
此题是一道环形DP题,不是很难,将环形圈断开成单链,即将线性链条*2即可,具体如图所示
然后从第一个点1开始,向右方DP,求出以第一个点为起点的DP最大值,最小值,DP完成后再从第2个点2开始,求出以第2个点为起点的DP最大值、最小值......依次直到起点到达环形终点第五个点5,求出所有最大值中的最最大值,最小值中的最最小值,这里第i个点为起点的含义是第一个断开的地方是第i个点与第i-1个点之间。
下面是代码:
#include <stdio.h>#include <string.h>#define MAX 10000000#define MIN -10000000int line[200],n,m,Min,Max,sum[200];int f[200][20];//f[i][j]=第1-i个数分成j份,结果最大值int g[200][20];//g[i][j]=第1-i个数分成j份,结果最小值int min(int a,int b){if(a>b)return b;return a;}int max(int a,int b){if(a>b)return a;return b;}void dp(int a[]){int i,j,k;for(i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];for(i=0;i<=n;i++)for(j=0;j<=m;j++){f[i][j]=0;g[i][j]=-1u>>1;}for(i=1;i<=n;i++){f[i][1]=g[i][1]=(sum[i]%10+10)%10;}f[0][0]=1;g[0][0]=1;for(j=2;j<=m;j++){for(i=j;i<=n;i++){for(k=j-1;k<i;k++){{f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));}}}}Max=max(Max,f[n][m]);Min=min(Min,g[n][m]);}int main(){int i,j,k;Max=0;Min=-1u>>1;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&line[i]);line[i+n]=line[i];}for(i=0;i<n;i++)dp(line+i);printf("%d\n%d\n",Min,Max);return 0;}
- [Wikioi 1025][NOIP 2003普及组]数字游戏
- NOIP 2003 普及组 数字游戏
- NOIP 2002 普及组 数字游戏
- NOIP 普及组 传球游戏
- [Wikioi 1009][NOIP 2002普及组]产生数
- NOIP普及组2003
- NOIP 2010普及组 数字统计
- noip2003普及组-数字游戏
- NOIP普及组 2003 兵乓球
- wikioi 1014 装箱问题 (2001年NOIP全国联赛普及组)
- wikioi 1010 过河卒 (2002年NOIP全国联赛普及组)
- [Wikioi 2808][NOIP 1998普及组]二的幂次方---HBNU的童鞋过来看看
- [普及] NOIP 2009 道路游戏
- wikioi 1017 乘积最大 (2000年NOIP全国联赛普及组NOIP全国联赛提高组)
- wikioi 1017 乘积最大 (2000年NOIP全国联赛普及组NOIP全国联赛提高组)
- 数字反转 2011年NOIP全国联赛普及组
- NOIP 2010 普及组 复赛 two 数字统计
- NOIP 2011 普及组 复赛 reverse 数字反转
- 动景科技(UC浏览器)与合一信息技术(优酷网)不正当竞争案管辖权异议裁定书
- Nyoj 745 蚂蚁的难题(二)
- 体验继承
- leetcode Longest Common Prefix
- unsigned int与int相加问题
- [Wikioi 1025][NOIP 2003普及组]数字游戏
- 算数表达式求值
- Oracle中TO_DATE TO_CHAR格式
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- Android 中使用 XML 中的 fragment 心得
- 线性表的链式存储(单链表)的c语言实现
- 字符串问题python实现(一)
- UVa 100 The 3n + 1 problem
- 图的最小生成树:Prim算法实现