live archive 4212 - Candy

1402 단어 archive
사탕 최대 몇 개까지 가져갈 수 있는지.사탕 하나를 가져갈 때, 그의 좌우 양쪽의 두 줄과 윗줄과 아랫줄의 두 줄은 모두 없을 것이다.
먼저 가로, 세로 DP: 상태 이동: dp[i] = max(dp[i-2], dp[i-3]) + dp[i];최대치만 구하면 돼.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;
const int N = 100009;
int map[N];
int dp[N];
int n,m;
int main()
{
    freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)&&(n+m))
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&map[1]);
            dp[i]=map[1];
            if(m>1)
            {
                scanf("%d",&map[2]);
                dp[i] = max(dp[i],map[2]);
            }

            for(int j=3;j<=m;j++)
            {
                scanf("%d",&map[j]);
                map[j] = max(map[j-2],map[j-3])+map[j];
                dp[i] =max(dp[i],map[j]);
            }
        }
        //for(int i=1;i<=n;i++) cout<<dp[i]<<" ";cout<<endl;
        int ans=dp[1];
        if(n>1) ans = max(ans,dp[2]);
        for(int i=3;i<=n;i++)
        {
            dp[i] = max(dp[i-2],dp[i-3])+dp[i];
            ans=max(ans,dp[i]);
        }
        printf("%d
",ans); } return 0; }

좋은 웹페이지 즐겨찾기