Codeforces 229D Towers 욕심 + dp

1205 단어
제목: n(1<=n<=5000)개의 탑이 있고, 높이는hi이며, 현재 탑을 인접한 두 탑(존재하면)에 놓는 비용은 1이며, 최소 얼마의 비용이 필요하면 내리지 않는 서열을 구성할 수 있는지 묻는다.
문제풀이: 욕심을 부리기 시작한다. 맨 뒤의 한 구역 내의 탑 높이와 최소를 확보해야 하기 때문에 욕심을 부리다가 마지막에 남은 탑 높이가 부족할 수도 있다. 그러면 마지막 무더기에 넣으면 wa가 된다.
tower[i]는 i탑에 도착했을 때 마지막 무더기의 최소 높이를 표시하고 dp[i]는 대응하는 최소 비용을 나타낸다.
Sure 오리지널, 전재는 출처를 밝혀 주십시오.
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn = 5002;
int tower[maxn],sum[maxn],dp[maxn];
int n;

void read()
{
    memset(dp,0,sizeof(dp));
    tower[0] = sum[0] = 0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&tower[i]);
        sum[i] = sum[i-1] + tower[i];
    }
    return;
}

void solve()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=i-1;j>=0;j--)
        {
            if(sum[i] - sum[j] >= tower[j])
            {
                tower[i] = sum[i] - sum[j];
                dp[i] = dp[j] + i - j - 1;
                break;
            }
        }
    }
    printf("%d
",dp[n]); return; } int main() { while(~scanf("%d",&n)) { read(); solve(); } return 0; }

좋은 웹페이지 즐겨찾기