zoukankan      html  css  js  c++  java
  • NYOJ 832 DP

    合并游戏

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

        大家都知道Yougth除了热爱编程之外,他还有一个爱好就是喜欢玩。

        某天在河边玩耍的时候,他发现了一种神奇的石子,当把两个石子放在一起的时候,后一个石子会消失,而且会蹦出一定数量的金币,这可乐坏了Yougth,但是他想得到最多的金币,他该怎么做?

     
    输入
    首先一行,一个n(1<=n<=10),表示有n个石子。
    接下来n*n的一个矩阵,Aij表示第i个和第j个合并蹦出的金币值(小于10000,注意合并后j会消失)。
    输出
    输出最多能得到的金币值。
    样例输入
    2
    0 4
    1 0
    3
    0 20 1
    12 0 1
    1 10 0
    样例输出
    4
    22
    来源
    Yougth原创
    上传者
    TC_杨闯亮
    代码:
    //只有10个数,状态压缩一下,先枚举状态然后枚举哪两个数合并,最后找到一个状态中
    //只有一个数的最大的状态。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,mp[12][12],f[1<<10];
    int main()
    {
        while(scanf("%d",&n)==1){
            int N=1<<n;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    scanf("%d",&mp[i][j]);
            memset(f,0,sizeof(f));
            for(int i=1;i<N;i++){
                for(int j=1;j<=n;j++){
                    if(i&(1<<(n-j))) continue;
                    for(int k=1;k<=n;k++){
                        if(k==j) continue;
                        if(!(i&(1<<(n-k)))) continue;
                        int sta=i^(1<<(n-k));
                        f[i]=max(f[i],f[sta]+mp[j][k]);
                    }
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++){
                int sta=(N-1)^(1<<(n-i));
                ans=max(ans,f[sta]);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    es6简述
    vue梳理
    webpack常用插件
    JS知识点
    CSS知识点
    224646
    223301
    图书馆 摘 1
    消息队列高手课 笔记6
    消息队列高手课 笔记5
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/6757449.html
Copyright © 2011-2022 走看看