dp[i][j] 表示第i个取j时的最小值
然后状态转移方程是:
dp[i][0] = cost[i][0] + min( dp[i-1][1], dp[i-1][2] );
dp[i][1] = cost[i][1] + min( dp[i-1][0], dp[i-1][2] );
dp[i][2] = cost[i][2] + min( dp[i-1][1], dp[i-1][0] );
AC代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int main(){
int T, Case = 1, N;
int cost[22][3];
int dp[22][3];
cin >> T;
while( T-- ){
cin >> N;
for( int i = 0; i < N; i++ ){
cin >> cost[i][0] >> cost[i][1] >> cost[i][2];
}
memset( dp, 0x3, sizeof( dp ) );
dp[0][0] = cost[0][0];
dp[0][1] = cost[0][1];
dp[0][2] = cost[0][2];
for( int i = 1; i < N; i++ ){
dp[i][0] = cost[i][0] + min( dp[i-1][1], dp[i-1][2] );
dp[i][1] = cost[i][1] + min( dp[i-1][0], dp[i-1][2] );
dp[i][2] = cost[i][2] + min( dp[i-1][1], dp[i-1][0] );
}
int ans = MAX;
ans = min( min( dp[N-1][0], dp[N-1][1] ), dp[N-1][2] );
cout << "Case " << Case++ << ": " << ans << endl;
}
return 0;
}