2021.02.19
作者:互联网
题意:Vasya有n天的假期!因此,他决定提高自己的IT技能并从事体育运动。Vasya知道这n天内每一天的以下信息:该体育馆是否开放以及当天是否在互联网上进行了比赛。对于我第一天有四个选项:
- 在这一天,健身房关闭,比赛没有进行;
- 在这一天,健身房关闭,比赛开始;
- 在这一天,健身房开放,比赛没有进行;
- 在这一天,健身房开放,比赛进行了。
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