標籤:
題意:給你一個n,m,n表示有n分鐘,每i分鐘對應的是第i分鐘能跑的距離,m代表最大疲勞度,每跑一分鐘疲勞度+1,當疲勞度==m,必須休息,在任意時刻都可以選擇休息,如果選擇休息,那麼必須休息到疲勞度為0,當然,當疲勞度為0的時候也是可以繼續選擇休息的,求在n分鐘後疲勞度為0所跑的最大距離
思路:dp[i][j]表示在第i分鐘疲勞度為j的時候所跑的最大距離,dp[i][j]=dp[i-1][j-1]+d[i];這個轉移,說的是,第i分鐘選擇跑步,當然,第i分鐘可以選擇不跑步,那麼就是選擇休息,題目說了,選擇休息的話必須要休息到疲勞度為0才可以跑,那還有一點,當疲勞度為0了,還是選擇繼續休息呢?dp[i][0]=dp[i-1][0];
選擇休息,那麼疲勞度到0了,這一點的最大距離怎麼做呢?dp[i][0]=max(dp[i][0],dp[i-k][k]) (0<k<=m&&i-k>0)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std;12 13 int dp[10005][1005];14 int ans[10005];15 16 int main()17 {18 int n,m;19 while(cin>>n>>m)20 {21 for(int i=1;i<=n;i++)22 scanf("%d",&ans[i]);23 memset(dp,0,sizeof(dp));24 25 for(int i=1;i<=n;i++)26 {27 for(int j=1;j<=m;j++) 28 dp[i][j]=dp[i-1][j-1]+ans[i];29 dp[i][0]=dp[i-1][0];30 for(int k=1;k<=m;k++)31 if(i-k>=0)32 dp[i][0]=max(dp[i][0],dp[i-k][k]);33 }34 cout<<dp[n][0]<<endl;35 }36 return 0;37 }
poj 3661 Running