上进小青年

导航

DP Hrbust1186青蛙过河

 

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1186

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 int flag[100020];//记录该点是否有石子
 7 int dp[100020];//dp[i]表示走到i点所需要的最少石子数目
 8 int main()
 9 {
10     int l,s,t,n;
11     while(cin>>l>>s>>t>>n){
12 
13         memset(flag,0,sizeof(flag));
14         int k;
15         for(int i=0;i<n;i++){
16             cin>>k;
17             flag[k]=1;
18         }
19 
20         memset(dp,-1,sizeof(dp));
21         dp[0]=0;//初始位置
22         for(int i=s;i<=l+t-1;i++){对所有可能走到的点i进行遍历
23             for(int j=i-t;j<=i-s;j++){对所有可能到达i的点遍历
24                 if(j>=0&&dp[j]!=-1){
25                     if(dp[i]==-1)dp[i]=dp[j]+flag[i];
26                     else dp[i]=min(dp[i],dp[j]+flag[i]);
27                 }
28             }
29         }
30         int mixn=100020;
31         for(int i=l;i<=l+t-1;i++){
32            if(dp[i]!=-1&&mixn>dp[i])
33                 mixn=dp[i];
34         }
35         cout<<mixn<<endl;
36     }
37 }
View Code

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int l,s,t,n;
 6 int DP[100010]={};
 7 
 8 int main()
 9 {
10     while(~scanf("%d%d%d%d",&l,&s,&t,&n))
11     {
12         memset(DP,0,sizeof(DP));
13         for(int i=1;i<=n;i++)
14         {
15             int temp;
16             scanf("%d",&temp);
17             DP[temp]=1;
18         }
19         for(int i=l-t-1;i>=0;i--)
20         {
21             int tmp=DP[i+s];
22             for(int j=s+1;j<=t;j++)
23             {
24                 tmp=min(tmp,DP[i+j]);
25             }
26             DP[i]+=tmp;
27         }
28         printf("%d\n",DP[0]);
29     }
30     return 0;
31 }
View Code

 

posted on 2016-08-10 11:59  上进小青年  阅读(238)  评论(0编辑  收藏  举报