Link:
Solution:
设$dp[i][j]$表示第$i$步走到$j$高度时经过的最高高度
分向上走和向下走两种方式转移即可
注意记录路径,最后输出时要逆序输出
(逆序输出时可以考虑利用递归方式输出)
Code:
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int T,n,d,dp[55][1005],pre[55][1005]; void print(int cur,int h) { if(pre[cur][h]==INF || cur<0) return; print(cur-1,pre[cur][h]); printf("%c",(pre[cur][h]>h)?‘D‘:‘U‘); } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(dp,0x3f,sizeof(dp));memset(pre,0x3f,sizeof(pre)); dp[0][0]=0; for(int i=0;i<n;i++) { scanf("%d",&d); for(int j=0;j<=1000;j++) { if(dp[i][j]==INF) continue; if(j+d<=1000 && dp[i+1][j+d]>max(dp[i][j],j+d)) dp[i+1][j+d]=max(dp[i][j],j+d),pre[i+1][j+d]=j; if(j-d>=0 && dp[i+1][j-d]>dp[i][j]) dp[i+1][j-d]=dp[i][j],pre[i+1][j-d]=j; } } if(dp[n][0]==INF) puts("IMPOSSIBLE"); else print(n,0),puts(""); } return 0; }
原文地址:https://www.cnblogs.com/newera/p/9157478.html
时间: 2024-11-06 12:30:39