POJ 3661 Running动态规划 刷表法

    xiaoxiao2021-03-26  20

            是在区间DP里面看到这道题目的,于是想用区间DP弄一弄,但是考虑到10000×10000的数组而且我还不会平行四边形优化,只能拿到n³的复杂度,于是就放弃了区间DP的做法

            思考了大约10分钟,发现根本不用区间DP嘛,定义状态dp[i][j]表示第i分钟疲劳度为j时走的最远距离,状态转移方程一下就出来了,可以选择走或者休息

            采用了刷表法1A,但是看见网上的很多都没用刷表法写嘛

            judge[i][j]表示状态[i][j]是否有效

            每一个状态[i][j]可以更新到3个位置,一个是[i+1][j+1](j<m),一个是[i+j][0](i+j<=n),一个是[i+1][0](j==0)

            不是很难,就不放到100道里面去了

    #include <iostream> #include <cstring> #include <algorithm> using namespace std; int dp[10005][505],n,m,d[10005]; bool judge[10005][505],t=true; int main(){ ios_base::sync_with_stdio(false); while(cin>>n>>m){ for(int i=1;i<=n;++i) cin>>d[i]; dp[0][0]=0; judge[0][0]=t; for(int i=0,limi=min(i,m);i<n;limi=min(++i,m)) for(int j=0;j<=limi;++j) if(judge[i][j]==t){ if(j<m&&(judge[i+1][j+1]!=t||dp[i+1][j+1]<dp[i][j]+d[i+1])) judge[i+1][j+1]=t,dp[i+1][j+1]=dp[i][j]+d[i+1]; if(i+j<=n&&(judge[i+j][0]!=t||dp[i+j][0]<dp[i][j])) judge[i+j][0]=t,dp[i+j][0]=dp[i][j]; if(j==0&&(judge[i+1][0]!=t||dp[i+1][0]<dp[i][j])) judge[i+1][0]=t,dp[i+1][0]=dp[i][j]; } cout<<dp[n][0]<<endl; t^=1; } }

    转载请注明原文地址: https://ju.6miu.com/read-659566.html

    最新回复(0)