其他分享
首页 > 其他分享> > 2021.02.19

2021.02.19

作者:互联网

CodeForces - 699C 

题意:Vasya有n天的假期!因此,他决定提高自己的IT技能并从事体育运动。Vasya知道这n天内每一天的以下信息:该体育馆是否开放以及当天是否在互联网上进行了比赛。对于第一天有四个选项:

 

  1. 在这一天,健身房关闭,比赛没有进行;
  2. 在这一天,健身房关闭,比赛开始;
  3. 在这一天,健身房开放,比赛没有进行;
  4. 在这一天,健身房开放,比赛进行了。

 

Vasya每天都可以休息一下或参加比赛(如果在这一天进行)或进行运动(如果健身房在这一天开放)。

找出Vasya可以休息的最短天数(这意味着,他将不会从事运动并同时撰写比赛)。Vasya唯一的限制-他不想连续两天进行相同的活动:这意味着,他将不会连续两天进行运动,而是连续两天进行比赛。

思路:就是进行简单的dp,然后进行选择,最后直接输出

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 int main(){
 6     int a[105];
 7     int dp[110][10];
 8     int n,m,t,k;
 9     cin>>n;
10     int ans=0;
11     for(int i=0;i<100;i++){
12         for(int j=0;j<10;j++){
13             dp[i][j]=10000;
14         }
15     } 
16     dp[0][1]=dp[0][2]=dp[0][3]=0;
17     for(int i=1;i<=n;i++){
18         cin>>a[i];
19         if(a[i]==0){
20             dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
21         }
22         else if(a[i]==1){
23             dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
24             dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
25         }
26         else if(a[i]==2){
27             dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
28             dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
29         }
30         else{
31             dp[i][0]=min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]))+1;
32             dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
33             dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
34         }
35     }
36     cout<<min(dp[n][0],min(dp[n][1],dp[n][2]));
37     return 0;
38 }
View Code

思考:像这种完全是前后不确定的选择,应该就是先看看是不是能够找规律,然后考虑比较简单的贪心算法是不是行得通,最后再看是不是dp,不能找规律wa了2次都不知道再重新找思路

标签:2021.02,Vasya,比赛,min,19,健身房,int,dp
来源: https://www.cnblogs.com/bonel/p/14443186.html