洛谷 P1359 租用游艇

发布时间 2023-03-26 21:54:42作者: 顾友

重点第一次想到这么简洁的dp代码,忍不住发一条

题目大意我就不描述了
这题我最开始以为的状态转移方程是 dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]+arr[i][j]) 嗯 只有8分, 后面再仔细看了一下题目意思,发现说的是i->j之间的游艇费用,而它经过j可以选择换游艇,也可以选择不换游艇继续开, 所以我们可以定义dp数组的含义为 dp[i] 表示 到达第i个游艇租用站 最少使用的费用 则到达j的最少费用为 min(dp[i] + arr[i][j]) i表示前面的站点

#include <iostream>
#define INF 100000000
using namespace std;
int n, m;
int arr[ 205 ][ 205 ];
int dp[ 205 ];
int main() {
  cin >> n;
  for ( int i = 1; i < n; i++ ) {
    for ( int j = i + 1; j <= n; j++ ) {
      cin >> arr[ i ][ j ];
    }
  }
  dp[ 2 ] = arr[ 1 ][ 2 ];

  for ( int j = 3; j <= n; j++ ) {
    int minx = INF;
    for ( int i = 1; i < j; i++ ) {
      minx = min( minx, arr[ i ][ j ] + dp[ i ] );
    }
    dp[ j ] = minx;
  }
  // for ( int i = 1; i < n; i++ ) {
  //   for ( int j = i + 1; j <= n; j++ ) {
  //     cout << dp[ i ][ j ] << " ";
  //   }
  //   cout << endl;
  // }
  cout << dp[ n ];
}

// 5 2 5 7 6 3 5 9 2 8 5