zoukankan      html  css  js  c++  java
  • codevs 1085 数字游戏 dp或者暴搜

    1085 数字游戏

     

    2003年NOIP全国联赛普及组

     时间限制: 1 s
     空间限制: 128000 KB
     
     
    题目描述 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:dp[i][j]=sigma(dp[i-j][t])  1<=t<=i-j;

    #include<bits/stdc++.h>
    using namespace std;
    #define ll __int64
    #define mod 1000000007
    #define pi (4*atan(1.0))
    const int N=1e3+10,M=1e6+10,inf=1e9+10;
    int dp[N][N],n,m;
    int dfs(int x,int y,int pre)
    {
        if(x<pre)
        return 0;
        if(y==1)
        return 1;
        int sum=0;
        for(int i=max(1,pre);i<=x;i++)
        sum+=dfs(x-i,y-1,i);
        return sum;
    }
    int main()
    {
        int x,y,z,i,t;
        scanf("%d%d",&x,&y);
        printf("%d
    ",dfs(x,y,0));
        return 0;
    }
    暴力代码
     
  • 相关阅读:
    上传文件漏洞(上传绕过)
    不安全的直接对象引用漏洞(浅析)
    python socket介绍
    python新手灰帽脚本练习---简易端口扫描
    python新手灰帽脚本练习---文件路径遍历收集
    python socket编程中端口被占用的解决方法(转载)
    .net core 使用功能总结
    Python学习计划整理
    Javascript 日期转换 几天前
    学习网站
  • 原文地址:https://www.cnblogs.com/jhz033/p/5614867.html
Copyright © 2011-2022 走看看