NOIP2003pj数字游戏[环形DP]

题目描述

丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共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 2
4
3
-1
2

输出样例#1:

7
81------------------------------------------------------------复制到后面f[i][j][k]表示i到j分成k段,转移和乘积最大好像该取模时就取模WARN:小心m==1
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
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);
} 
时间: 2024-10-13 11:40:46

NOIP2003pj数字游戏[环形DP]的相关文章

NOIP2009pj道路游戏[环形DP 转移优化 二维信息]

题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编号为1~n,因为马路是环形的,所以第 n 个机器人工厂和第 1 个机器人工厂是由一段马路连接在一起的.小新将连接机器人工厂的这 n 段马路也编号为 1~n,并规定第 i 段马路连接第 i 个机器人工厂和第 i+1 个机器人工厂(1≤i≤n-1),第 n 段马路连接第 n 个机器人工厂和第 1个机器人

codevs1085数字游戏(环形DP+划分DP )

1085 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 2

DP——数字游戏

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

codevs 1085 数字游戏 dp或者暴搜

1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2):

多边形游戏(经典的环形dp)

描述 一个多边形,开始有n个顶点.每个顶点被赋予一个正整数值,每条边被赋予一个运算符"+"或"*".所有边依次用整数从1到n编号. 现在来玩一个游戏,该游戏共有n步: 第1步,选择一条边,将其删除 随后n-1步,每一步都按以下方式操作:(1)选择一条边E以及由E连接着的2个顶点v1和v2: (2)用一个新的顶点取代边E以及由E连接着的2个顶点v1和v2,将顶点v1和v2的整数值通过边E上的运算得到的结果值赋给新顶点. 最后,所有边都被删除,只剩一个顶点,游戏结束.游

区间dp与环形dp

区间dp 常见题型 求区间[1,n]XXXXX后的最大/小值,一般分为无要求或只能/最多分成m段两类 做法 如对分段无要求,设dp[i][j]表示序列中[i,j]的最值,最外层循环区间长度,第二层循环左端点,并能确定右端点,第三层枚举断点: for(rint len = 1;len <= n; ++len) {//如果对len == 1初始化了可从2枚举 for(rint i = 1,j = i + len - 1;j <= n;++i,++j) { for(rint k = i;k <

Vijos P1218 数字游戏

描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 格式 输入格式 输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9).以下n行每行有个整数,其绝对值不大于10^410?4??,按顺序给出圈中的数字,首尾相接. 输出

BZOJ2900 好玩的数字游戏

好玩的数字游戏 TK在虐题的同时,也喜欢玩游戏.现在,有这样的一个游戏,规则是这样的:先随机给出一个数字N,然后你在操场上把1到N的所有数字写成一排,就像这样:123456789101112131415-.接着你在每个数字前面添上加减号,每逢排在奇数位上的数字,就写上加号:每逢排在偶数位上的数字,就写上减号.恩-最后你得到一个超级长的式子.并且可以算出这个式子的结果.TK觉得这个游戏很有意思,于是他没日没夜地玩啊玩啊玩啊-或许你觉得这个游戏没有意思-恩-但是,如果你是TK,对于给定的N,你能够算

XDU1160 - 科协的数字游戏I

Description 科协里最近很流行数字游戏.某人命名了一种不降数,这种数字必须满足从左到右各位数字成大于等于的关系,如123,446.现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数. Input 题目有多组测试数据.每组只含2个数字a, b (1 <= a, b <= 2^31). Output 每行给出一个测试数据的答案,即[a, b]之间有多少阶梯数. Sample Input 1 9 1 19 Sample Output 918 数位DP基础题: