“炫舞家“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;
}
- “炫舞家“ST
- “炫舞家“ST
- “炫舞家“ST
- 题目 740 “炫舞家“ST
- NYOJ,740“炫舞家” ST
- nyoj 740 “炫舞家“ST
- NYOJ740 - “炫舞家“ST (DP)
- NYOJ 740 “炫舞家“ST
- NYOJ 740 “炫舞家”ST
- nyoj740“炫舞家“ST【dp】
- nyist 740 “炫舞家“ST
- nyoj-740 “炫舞家“ST
- ST
- ST
- ST
- NYOJ 640 “炫舞家“ST(DP)
- nyistOJ-“炫舞家“ST(DP)
- nyist 740 “炫舞家“ST(动态规划)
- 7-3用图示RFID系统信号的通信过程
- java Thread的join()方法
- CenOs 安装 Nginx + Tcp 教程
- Bundle状态及转换
- Mac OSX的JDK安装与配置
- “炫舞家“ST
- 【万里征程——Windows App开发】文件&数据——获取文件属性
- 安卓中的abstract使用
- 安慰奶牛
- 使用Shell脚本实现SFTP下载文件
- json 数组 对象
- hdu 1546
- dnw for Linux error:Can not open /dev/secbulk0
- Java基础---面向对象(面向对象,类,对象,匿名对象,封装,构造函数,构造代码块,this,static,main,帮助文档,静态代码块,单例)