2020昆明站的C给我整傻了,回来写dp基础题找找自信,裂开~
Question:
分析:
首先,这道题是只能从编号小的点走到编号大的点,可以考虑dp
dp[i]表示从1走到 i 时花费最小的值,则对于整体的从1 到 j (j >= i)的最优策略是
Code:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[1010][1010];
int dp[1010];
int u, v, w;
int main(void)
{
cin >>n >>m;
memset(a,127,sizeof(a));
for(int i = 1; i <= m; i++){
cin >>u >>v >>w;
a[u][v] = min(a[u][v], w);
}
memset(dp,127,sizeof(dp));
dp[1] = 0;
for(int i = 2; i <= n; i++){
for(int j = 1; j < i; j++){
//小于2^30就说明这个路径是存在的
if(dp[j] < (1<<30) && a[j][i] < (1<<30))
dp[i] = min(dp[i], dp[j] + a[j][i]);
}
}
cout <<dp[n];
return 0;
}