Tyvj 1211 DP

来源:互联网 发布:格式化恢复软件 编辑:程序博客网 时间:2024/05/22 20:04

dp[i][num[i]][j] 表示第i次 左脚在num[i]位置上,右脚在j位置上的最小消耗体能值

dp[i][j][num[i]]表示第i次 右脚在num[i]位置上,左脚在j位置上的最小消耗体能值

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define MAX 0x3f3f3f3fint dp[11000][5][5];int num[10000];int main(){int N;while( scanf( "%d", &N ) != EOF ){for( int i = 0; i < N; i++ ){cin >> num[i];num[i]--;}memset( dp, 0x3f, sizeof( dp ) );dp[0][num[0]][4] = 2;dp[0][4][num[0]] = 2;for( int i = 1; i < N; i++ ){//遍历左脚for( int j = 0; j < 5; j++ ){if( j == num[i] ){continue;}for( int k = 0; k < 5; k++ ){if( k == j || dp[i-1][k][j] == MAX ){continue;}if( k == 4 ){dp[i][num[i]][j] = min( dp[i][num[i]][j], dp[i-1][k][j] + 2 );}else if( abs( k - num[i] ) == 2 ){dp[i][num[i]][j] = min( dp[i][num[i]][j], dp[i-1][k][j] + 4 );}else if( abs( k - num[i] ) == 1 || abs( k - num[i] ) == 3 ){dp[i][num[i]][j] = min( dp[i][num[i]][j], dp[i-1][k][j] + 3 );}else{dp[i][num[i]][j] = min( dp[i][num[i]][j], dp[i-1][k][j] + 1 );}}}//遍历右脚for( int j = 0; j < 5; j++ ){if( j == num[i] ){continue;}for( int k = 0; k < 5; k++ ){if( k == j || dp[i-1][j][k] == MAX ){continue;}if( k == 4 ){dp[i][j][num[i]] = min( dp[i][j][num[i]], dp[i-1][j][k] + 2 );}else if( abs( k - num[i] ) == 2 ){dp[i][j][num[i]] = min( dp[i][j][num[i]], dp[i-1][j][k] + 4 );}else if( abs( k - num[i] ) == 1 || abs( k - num[i] ) == 3 ){dp[i][j][num[i]] = min( dp[i][j][num[i]], dp[i-1][j][k] + 3 );}else{dp[i][j][num[i]] = min( dp[i][j][num[i]], dp[i-1][j][k] + 1 );}}}}int ans = MAX;for( int i = 0; i < 5; i++ ){ans = min( dp[N-1][num[N-1]][i], ans );}for( int i = 0; i < 5; i++ ){ans = min( dp[N-1][i][num[N-1]], ans );}cout << ans << endl;}return 0;}


0 0