关于定义
查看原帖
关于定义
234224
青鸟_Blue_Bird楼主2022/9/21 14:16

RT,蒟蒻采用的是简单易懂的三维动态规划。然后第一次采用的是 dp[i][j][0/1], 表示第 i 秒我还能跳j次,0/1表示在哪棵树,然后WA了两个点。

第二次将 j 改为 已经跳了多少次,直接AC,请问大佬们这是什么原因?两种写法除了定义以外应该都是一样的啊

第一种写法

  for(int i = 1; i <= T; i++){
    for(int j = 0; j <= W; j++){
      if(j % 2 == 0) dp[i][j][0] = max(dp[i][j][0], max(dp[i-1][j][0], dp[i-1][j+1][1]) + (a[i] == 1)); 
      else dp[i][j][1] = max(dp[i][j][1], max(dp[i-1][j][1], dp[i-1][j+1][0]) + (a[i] == 2)); 
    }
  }

第二种写法:

#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long

template <class T>
inline void read(T& a){
	T x = 0, s = 1;
	char c = getchar();
	while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
	while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
	a = x * s;
	return ;
}

int T, W; 
int a[N]; 
int dp[N][50][2]; 

int main(){
  // freopen("hh.txt", "r", stdin); 
  read(T), read(W);
  for(int i = 1; i <= T; i++)
    read(a[i]);
  for(int i = 1; i <= T; i++){
    for(int j = 0; j <= W; j++){
      if(!j){
        dp[i][j][0] = max(dp[i][j][0], dp[i-1][j][0] + (a[i] == 1)); 
        continue ; 
      }
      if(j % 2 == 0) dp[i][j][0] = max(dp[i][j][0], max(dp[i-1][j][0], dp[i-1][j-1][1]) + (a[i] == 1)); 
      else dp[i][j][1] = max(dp[i][j][1], max(dp[i-1][j][1], dp[i-1][j-1][0]) + (a[i] == 2)); 
    }
  }
  
  int ans = -666; 
  for(int i = 0; i <= W; i++)
    ans = max(ans, max(dp[T][i][0], dp[T][i][1])); 
  cout << ans << endl; 
  return 0;
}
2022/9/21 14:16
加载中...