题意 : 中文题不详述。
思路 : sum = L*N 段,每走过一段如果不用加速卡的话,能量会增20%,将20%看作1,也就是说每涨到15就要变为10,所以最多是14才不浪费。
dp[i][j]代表第 i 段路需要能量是 j 的最少时间。状态转移方程是
//不用能量卡的时候
dp[i][j+1] = min(dp[i-1][j]+a[(i-1)%L],dp[i][j+1]) ;
//用能量卡的时候,用完了之后能量卡减5
dp[i][j-5] = min(dp[i][j-5],dp[i-1][j]+b[(i-1)%L]) ;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//HDU 1494 #include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int a[110],b[110] ; int dp[11000][20] ; const int INF = 999999999 ; int main() { int L ,N ; while(~scanf("%d %d",&L,&N)) { for(int i = 0 ; i < L ; i ++) scanf("%d",&a[i]) ; for(int i = 0 ; i < L ; i++) scanf("%d",&b[i]) ; int sum = L*N ; for(int i = 0 ; i <= sum ; i++) for(int j = 0 ; j <= 15 ; j++) dp[i][j] = INF ; dp[0][0] = 0 ; for(int i = 1 ; i <= sum ; i++) { for(int j = 14 ; j >= 0 ; j --)//不用能量卡的时候 dp[i][j+1] = min(dp[i-1][j]+a[(i-1)%L],dp[i][j+1]) ; for(int j = 14 ; j >= 5 ; j--)//用能量卡的时候,用完了之后能量卡减5 dp[i][j-5] = min(dp[i][j-5],dp[i-1][j]+b[(i-1)%L]) ; dp[i][10] = min(dp[i][10],dp[i][15] ) ;//每次满15之后都要变成10 } int minn = INF ; for(int i = 0 ; i < 15 ; i++) minn = min(minn,dp[sum][i]) ; printf("%d\n",minn) ; } return 0 ; }