“炫舞家“ST

来源:互联网 发布:snow拍照软件 编辑:程序博客网 时间:2024/04/28 18:05


http://acm.nyist.net/JudgeOnline/problem.php?pid=740

http://www.haodaima.net/art/2665368

//操作比较繁琐的dp,思路理清就好理解了

#include <stdio.h>
#include <string.h>

int dp[10001][5][5], step[10001];

int cost[5][5] = {{1, 2, 2, 2, 2}, {2, 1, 3, 4, 3}, {2, 3, 1, 3, 4}, {2, 4, 3, 1, 3}, {2, 3, 4, 3, 1}};  //cost[i][j]:表示i到j所消耗的体力

int check(int left, int right)     //判断是否可以从一个状态转到下一个状态
{
    if(left == 0 && right == 0)
    {
        return 1;
    }
    if(left != right)
    {
        return 1;
    }
    return 0;
}

int main()
{
    int n, i, j, k, left, right, tmin;
    while(scanf("%d", &step[1]) && step[1] != 0)
    {
        n = 1;
        while(scanf("%d", &step[++n]) && step[n] != 0);    //录入数据
        memset(dp, 127, sizeof(dp));             //初始化
        dp[0][0][0] = 0;
        for(i = 1; i < n; i++)
        {
            for(j = 0; j < 5; j++)            //不动的脚踩的地方
            {
                left = right = 0x7f7f7f7f;
                for(k = 0; k < 5; k++)
                {
                    if(check(j, k) && dp[i-1][j][k]+cost[k][step[i]] < left)   //左脚不动,右脚踩
                    {
                        left = dp[i-1][j][k]+cost[k][step[i]];
                    }
                }
                for(k = 0; k < 5; k++)
                {
                    if(check(j, k) && dp[i-1][k][j]+cost[k][step[i]] < right)   //右脚不动,左脚踩
                    {
                        right = dp[i-1][k][j]+cost[k][step[i]];
                    }
                }
                dp[i][j][step[i]] = dp[i][step[i]][j] = (left < right ? left : right);
            }
        }
        tmin = 0x7f7f7f7f;
        for(i = 0; i < 5; i++)          //遍历所有脚在step[n-1]的情况找最小值
        {
            if(dp[n-1][i][step[n-1]] < tmin)
            {
                tmin = dp[n-1][i][step[n-1]];
            }
            if(dp[n-1][step[n-1]][i] < tmin)
            {
                tmin = dp[n-1][step[n-1]][i];
            }
        }
        printf("%d\n", tmin);
    }
    return 0;
}


/////////////////////////////////////////////////////////////////////////////////////

#include<iostream>
#include<string>
#define min(x,y) (x<y?x:y)
using namespace std;
int dp[10010][5][5];
int main()
{
 int cost[5][5],a[10010];
 cost[0][1]=cost[0][2]=cost[0][3]=cost[0][4]=2;
 cost[1][2]=cost[1][4]=cost[2][1]=cost[2][3]=3;
 cost[3][2]=cost[3][4]=cost[4][1]=cost[4][3]=3;
 cost[1][3]=cost[3][1]=cost[2][4]=cost[4][2]=4;
 cost[1][1]=cost[2][2]=cost[3][3]=cost[4][4]=1;
 int i;
 while(1)
 {
 for(i=1;;i++)
 {
 cin>>a[i];
 if(a[i]==0)
 break;
 }
 if(a[1]==0)
 break;
 
 for(int f=1;f<=10000;f++)
 for(int f1=0;f1<=4;f1++)
 for(int f2=0;f2<=4;f2++)
 dp[f][f1][f2]=9999999;
 
 dp[1][0][a[1]]=cost[0][a[1]];
 dp[1][a[1]][0]=cost[0][a[1]];
 
 for(int j=2;j<i;j++)
 for(int k1=0;k1<5;k1++)
 for(int k2=0;k2<5;k2++)
 {
  if(k1!=k2)
  {
  dp[j][k1][a[j]]=min(dp[j][k1][a[j]],dp[j-1][k1][k2]+cost[k2][a[j]]);
  dp[j][a[j]][k2]=min(dp[j][a[j]][k2],dp[j-1][k1][k2]+cost[k1][a[j]]); 
  }
 }
 int mmin=9999999;
 for(int f1=0;f1<5;f1++)
 for(int f2=0;f2<5;f2++)
 {
  if(f1!=f2 && dp[i-1][f1][f2]<mmin)
  mmin=dp[i-1][f1][f2];
 }
 cout<<mmin<<endl;
 }
 return 0;
}



0 0
原创粉丝点击