POJ 3003 Spiderman’s workout

1566 단어
제목: 스파이더맨은 벽을 오르는 운동을 총 n회 합니다. 올라갈 수도 내려갈 수도 있지만 결국은 바닥에 떨어져야 합니다. 그리고 중간에 땅에 올라갈 수 없습니다.최우선책인 최고점에 오르려면 가능한 한 낮춰야 한다.
문제풀이: 전형적인 DP문제, dp[i][j]는 첫 번째 단계가 j 높이에 올랐을 때 기어올랐던 최고점을 대표하는 동시에pr[i][j]로 지난번 높이를 대표하고 상태 이동은 한 번 더하고 한 번 줄이면 된다. 마지막으로 dfs가 결과를 출력하면 된다.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[50][1050],pr[50][1050];
const int inf=0x3f3f3f3f;
void dfs(int k,int d)
{
    if(pr[k][d]!=-1)
    {
        dfs(k-1,pr[k][d]);
        printf("%c",(pr[k][d]>d)?'D':'U');
    }
}
int main()
{
    int T;
    for(scanf("%d",&T);T;T--)
    {
        int n;
        scanf("%d",&n);
        memset(dp,0x3f,sizeof(dp));
        memset(pr,-1,sizeof(pr));
        dp[0][0]=0;
        for(int i=1,d;i<=n;i++)
        {
            scanf("%d",&d);
            for(int j=0;j<=1000;j++)
            {
                if(j-d>=0&&dp[i-1][j-d]!=inf&&dp[i][j]>max(dp[i-1][j-d],j))
                {
                    dp[i][j]=max(dp[i-1][j-d],j);
                    pr[i][j]=j-d;
                }
                if(j+d<=1000&&dp[i-1][j+d]!=inf&&dp[i][j]>dp[i-1][j+d])
                {
                    dp[i][j]=dp[i-1][j+d];
                    pr[i][j]=j+d;
                }
            }
        }
        if(dp[n][0]==inf)
            printf("IMPOSSIBLE");
        else
            dfs(n,0);
        printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기