9도 1547 출입창(배달DP)

5006 단어 dp
제목 설명:
처음에 비어 있는 창고와 n개의 작업으로 구성된 작업 순서를 지정합니다. 모든 작업은 출고나 입고일 수 있습니다.작업 시퀀스를 실행하는 과정에서 불법 작업이 발생하지 않도록 요구한다. 즉, 빈 창고에서 출고 작업을 실행하지 않을 뿐만 아니라 작업 시퀀스가 완성된 후에 창고가 꼭 빈 창고가 되도록 보장한다.조건에 부합되는 조작 시퀀스 종류를 구하다.예를 들어 4개의 작업으로 구성된 작업 순서는 다음과 같다. 입고, 출고, 입고, 입고, 입고, 입고, 출고, 총 2종이다.
 
사고의 방향
1.Leetcode에 비슷한 문제가 있는데 그 문제는 괄호의 총류를 구하고 애초에 검색법을 사용했다
2. 검색법 시간 초과, 분치법 좋은 방법 생각 안 나
3. dp[i][j](i>=j)는 입고 i회 출고 j회의 종류수를 나타낸다
4. dp[i][j] = dp[i-1][j] + dp[i][j-1]. 상태 이동 방정식에서 이러한 근거를 쓰는 것은 마지막 자리가 각각'('와')인 상황을 토론하는 데 있어야 한다.검지offer가 바닥을 깔아놓은 문제처럼.예를 들어 dp[3][2], 마지막 사람이'(''일 때 dp[3][2]=dp[2][2],')'로 확정될 때 dp[3][2]=dp[3][1].이렇게 보면 이 문제는 자신이 이전에 했던 많은 문제와 유사하다. 예를 들어 계단을 오르는 것, 예를 들어 네모난 칸으로 길을 찾는 등이다.이 문제들의 공통된 특징은 마지막 상태의 위치에 따라 앞의 모든 가능성을 점차적으로 미루는 것이다.
5.leetcode가 그 문제에 대응하는 것을 보고 그것이 인쇄 경로라는 것을 발견하여 검색법이 시간을 초과하지 않았습니다.
 
코드가 9도 테스트를 통과하지 못했다
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int dp[1200][1200];

int find(int a, int b) {
    if(a < b) 
        return 0;
    if(dp[a][b] != 0)
        return dp[a][b];
    if(a == 0 || b == 0)
        return 0;
    int res = find(a-1,b) + find(a,b-1);
    if(res >= 1000000007 )
        res = res%1000000007;
    return (dp[a][b] = res);
}
int main() {
    freopen("testcase.txt", "r", stdin);
    int n;
    memset(dp, 0, sizeof(dp));
    for(int i = 0; i < 1010; i ++)
        dp[i][0] = 1;
    dp[1][1] = 1;

    while(scanf("%d", &n) != EOF) {
        int res = find(n/2,n/2);
        printf("%d
", res); } return 0; }

 

좋은 웹페이지 즐겨찾기