洛谷p3399
以上为题目:
dp 可ac
将每个城市到另一个城市作为一个阶段,那么,每个城市有两种决策,一种是休息,另一种是行进;
则状态转移方程为:
dp[I][j]=min(dp[I-1][j],dp[I-1][j-1]+d[I]*c[j];
min中第一种情况f(i,j-1)是从在这个城市过夜,等于这个城市上一天的疲劳值。
第二种情况(i-1,j-1)+d[i]*c[j]则则代表了天刚从上一个城市走过来,那么就等于昨天上一个城市的疲劳值加上从上一个城市走过来积累的疲劳值。以下为代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m, d[1001], c[1001], dp[1001][1001];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> d[i];
for (int i = 1; i <= m; i++) cin >> c[i];
memset(dp, 0x3f, sizeof(dp));//初始化dp数组为无数大;
memset(dp[0], 0, sizeof(dp[0]));//初始化第一行为0;
for(int i=1;i<=n;i++)
for (int j = 1; j <= m; j++) {
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j - 1] + d[i] * c[j]);
}
cout << dp[n][m] << endl;
return 0;
}