2021.02.20个人赛
作者:互联网
C题:https://codeforces.com/problemset/problem/699/C
题目大意:
该题就是一个人每天有四种情况,休息,比赛,运动,比赛或运动;其中不能连续进行比赛和运动,给出n天可选择的情况,问最小的休息天数。
思路:
该题其实便可想到,本天的情况,可由上一天的基础是来考虑,所以便可使用DP,来进行求解,比赛或运动这种情况,可以通过分成两块来进行考虑。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> #include <queue> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e7 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int dp[110][4]; int v[110]; int main() { //0 休息 1 比赛 2 运动 3 运动和比赛 int n; cin >> n; for(int i = 0;i <= n;i++){ for(int j = 0;j <= 3;j++){ dp[i][j] = maxn; } } dp[0][0] = 0; for(int i = 1;i <= n;i++){ cin >> v[i]; } int minnum = maxn; for(int i = 1;i <= n;i++){ dp[i][0] = min(dp[i-1][0],dp[i-1][1]); dp[i][0] = min(dp[i][0],dp[i-1][2]); dp[i][0]++; if(v[i] == 1){ dp[i][1] = min(dp[i-1][0],dp[i-1][2]); } if(v[i] == 2){ dp[i][2] = min(dp[i-1][0],dp[i-1][1]); } if(v[i] == 3){ dp[i][1] = min(dp[i-1][0],dp[i-1][2]); dp[i][2] = min(dp[i-1][0],dp[i-1][1]); } } minnum = min(minnum,dp[n][0]); minnum = min(minnum,dp[n][1]); minnum = min(minnum,dp[n][2]); cout << minnum << endl; }
标签:2021.02,20,比赛,int,long,个人赛,maxn,const,include 来源: https://www.cnblogs.com/emhhbw/p/14441936.html