zoukankan      html  css  js  c++  java
  • SOJ 2818_QQ音速

    【题意】两只手,一次只能用一只手按一个键子(0,1,2,3),给出从i键到j键所需的消耗的体力,求依次按下一系列键子所需最小体力。

    【分析】

    法一:开一个三维数组,分别记录移动到位置及左右手按的键子。

    状态转移方程;

     v[k][i][j]=min(v[k-1][c[k-1]-'0'][j]+w[c[k-1]-'0'][i],v[k-1][i][c[k-1]-'0']+w[c[k-1]-'0'][j]);其中k取遍0.1.2.3

    【代码】

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1000050;
    int v[maxn][4][4];
    int w[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,2},{2,1,2,0}};
    int Min;
    char c[maxn];
    const int INF=0x3fffffff;
    int main (void)
    {
        while(scanf("%s",c)==1)
        {
            Min=INF;
            int len=strlen(c);
            memset(v,10,sizeof(v));
            for(int i=0;i<4;i++)
                 for(int j=0;j<4;j++)
                     v[0][i][j]=w[3][j]+w[2][i];
    
    
             for(int k=1;k<len;k++)
            {
                for(int i=0;i<4;i++)
                {
                    for(int j=0;j<4;j++)
                        v[k][i][j]=min(v[k-1][c[k-1]-'0'][j]+w[c[k-1]-'0'][i],v[k-1][i][c[k-1]-'0']+w[c[k-1]-'0'][j]);
                }
            }
          for(int i=0;i<4;i++)
            {
                Min=min(v[len-1][i][c[len-1]-'0'],Min);
                Min=min(v[len-1][c[len-1]-'0'][i],Min);
            }
            printf("%d
    ",Min);
        }
        return 0;
    }
    

    法二:开一个二维数组,分别记录移动的次数及对于某一只手来说该次移动所按的键子(注意边界

    状态转移方程:

    对于j取遍0,1,2,3

    当j==c[i-1]-'0'时
                        for(int k=0;k<4;k++)
                           v[i][j]=min(v[i][j],v[i-1][k]+w[k][c[i]-'0']);(j==c[i-1]-'0'
    当j!=c[i-1]-'0时     v[i][j]=v[i-1][j]+w[c[i-1]-'0'][c[i]-'0'];

    【代码】

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1000050;
    int v[maxn][4];
    int w[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,2},{2,1,2,0}};
    int Min,len;
    char c[maxn];
    const int INF=0x3fffffff;
    int main (void)
    {
        while(scanf("%s",c)==1)
        {
            Min=INF;
            len=strlen(c);
            for(int i=0;i<maxn;i++)
                 for(int j=0;j<4;j++)
                     v[i][j]=INF;
            v[0][2]=w[3][c[0]-'0'];
            v[0][3]=w[2][c[0]-'0'];
            for(int i=1;i<len;i++)
            {
                for(int j=0;j<4;j++)
                {
                   if(j==c[i-1]-'0')
                    {
                        for(int k=0;k<4;k++)
                           v[i][j]=min(v[i][j],v[i-1][k]+w[k][c[i]-'0']);
                    }
                   else
                        v[i][j]=v[i-1][j]+w[c[i-1]-'0'][c[i]-'0'];
                }
            }
            for(int i=0;i<4;i++)
                Min=min(v[len-1][i],Min);
            printf("%d
    ",Min);
        }
        return 0;
    }
    


  • 相关阅读:
    js中属性和方法的类型和区别
    深入理解js构造函数
    null和undefined区别(转)
    理解闭包 js回收机制
    php:判断 是否开启 SSL,CURL,ZIP,GD2,MYSQL,是否安装MEMCACHED
    php:封装了个时间函数,返回类似“1分钟前发布”,“5小时前发布”,“3年前发布”
    php:获取一个表不含text类型的全部字段
    php:两个文件夹递归地比较,没有的文件自动复制过去
    php:php相关的函数或用法记录
    js:常用到的js操作记录
  • 原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758873.html
Copyright © 2011-2022 走看看