zoukankan      html  css  js  c++  java
  • dp周训练 状态压缩

    题目链接:题意:给你一个10*10的矩阵,每到一个格子中都要拿一个0-9的数值,求从矩阵左上方走到右下方且必须0-9都经过,拿的数值和最小是多少;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int inf = 0x3f3f3f3f;
    const double pi=acos(-1);
    const int mod=100000000;
    ll max(ll a,ll b)
    {return a>b?a:b;};
    int min(int a,int b)
    {return a<b?a:b;};
    
    int a[12][12],dp[12][12][(1<<12)];
    int main()
    {
        MM(dp,inf);
        for(int i=1;i<=10;i++)
            for(int j=1;j<=10;j++)
                {
                    int v;
                    scanf("%d",&v);
                    if(i==1&&j==1) dp[i][j][1<<v]=v;
                    a[i][j]=v;
                }
    
        for(int i=1;i<=10;i++)
           for(int j=1;j<=10;j++)
             for(int k=0;k<=(1<<10)-1;k++)
             {
                 int v=a[i+1][j];
                 dp[i+1][j][k|(1<<v)]=min(dp[i+1][j][k|(1<<v)],dp[i][j][k]+v);
                 v=a[i][j+1];
                 dp[i][j+1][k|(1<<v)]=min(dp[i][j+1][k|(1<<v)],dp[i][j][k]+v);
             }
        printf("%d
    ",dp[10][10][(1<<10)-1]);
        return 0;
    }
    

      本来一血的,犯了个傻逼错误;看wa代码;

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long Ull;
    #define MM(a,b) memset(a,b,sizeof(a));
    const double eps = 1e-10;
    const int inf = 0x3f3f3f3f;
    const double pi=acos(-1);
    const int mod=100000000;
    ll max(ll a,ll b)
    {return a>b?a:b;};
    int min(int a,int b)
    {return a<b?a:b;};
    
    int a[12][12],dp[12][12][(1<<12)];
    int main()
    {
        MM(dp,inf);
        for(int i=1;i<=10;i++)
            for(int j=1;j<=10;j++)
                {
                    int v;
                    scanf("%d",&v);
                    dp[i][j][1<<v]=v;
                    a[i][j]=v;
                }
    
        for(int i=1;i<=10;i++)
           for(int j=1;j<=10;j++)
             for(int k=0;k<=(1<<10)-1;k++)
             {
                 int v=a[i+1][j];
                 dp[i+1][j][k|(1<<v)]=min(dp[i+1][j][k|(1<<v)],dp[i][j][k]+v);
                 v=a[i][j+1];
                 dp[i][j+1][k|(1<<v)]=min(dp[i][j+1][k|(1<<v)],dp[i][j][k]+v);
             }
        printf("%d
    ",dp[10][10][(1<<10)-1]);
        return 0;
    }
    

      犯错原因:初始化时对每个格子都dp[i][j][1<<v]=v;没道理啊,,题目都说了必须从左上角开始走

  • 相关阅读:
    dubbo入门(一)
    java中文件操作《一》
    Unity 游戏框架搭建 2019 (七) 自定义快捷键
    凉鞋:我所理解的框架 【Unity 游戏框架搭建】
    Unity 游戏框架搭建 2019 (六) MenuItem 复用
    Unity 游戏框架搭建 2019 (五) 打开所在文件夹
    Unity 游戏框架搭建 2019 (四) 导出 UnityPackage
    Unity 游戏框架搭建 2019 (三) 生成文件名到剪切板
    Unity 游戏框架搭建 2019 (二) 文本复制到剪切板
    Unity 游戏框架搭建 2019 (一) 简介与第一个示例文件名的生成
  • 原文地址:https://www.cnblogs.com/smilesundream/p/5380209.html
Copyright © 2011-2022 走看看