数字游戏(两个大神写得)
2014-12-20 16:58
211 查看
Description
丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。例如,对于下面这圈数字(n=4,m=2):#include<cstdio> #include<algorithm> using namespace std; int n,m,Max,Min,s[55],d[55][10],dp[55][10]; void DP(int a[]) { int i,j,k; for(i=1;i<=n;i++) s[i]=s[i-1]+a[i]; for(i=0;i<=n;i++) for(j=0;j<=m;j++) { d[i][j]=0; dp[i][j]=-1u>>1; } d[0][0]=dp[0][0]=1; for(i=1;i<=n;i++) d[i][1]=dp[i][1]=(s[i]%10+10)%10; for(j=2;j<=m;j++) for(i=j;i<=n;i++) for(k=j-1;k<i;k++) { d[i][j]=max(d[i][j],d[k][j-1]*(((s[i]-s[k])%10+10)%10));//第k+1个数到第i个数分到第j部分 dp[i][j]=min(dp[i][j],dp[k][j-1]*(((s[i]-s[k])%10+10)%10)); } Max=max(Max,d [m]); Min=min(Min,dp [m]); } int main() { // freopen("a.txt","r",stdin); while(scanf("%d%d",&n,&m)==2) { int i,j,a[105]; Max=0; Min=-1u>>1; for(i=1;i<=n;i++) { scanf("%d",a+i); a[n+i]=a[i]; } for(j=0;j<n;j++) DP(a+j); printf("%d\n%d\n",Min,Max); } }
View Code
相关文章推荐
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 题目:两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍,要保证结果非负,首先得到0的人获胜。
- 关于不使用第三方数字交换两个数字的实现
- XDU 1160 - 科协的数字游戏I
- 和为S的两个数字与退出双层循环
- 10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]
- 一个猜数字游戏的算法
- 第四周项目13-猜数字游戏
- 易语言 猜数字游戏
- 解决把两个数字的和、积分别告诉两个人猜两个数字组合的问题
- Cocos2d-x游戏实战项目开发:猜数字游戏
- LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
- 和为S的两个数字java实现
- 【转】Java数字抽奖游戏核心代码
- 和为s的两个数字
- (剑指Offer)面试题41:和为s的两个数字
- 用c语言实现模拟用户登录程序以及猜数字游戏
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 和为S的两个数字(牛客网二十五)
- 找出数组中唯一出现一次的两个数字