2018.1.29 [AtCoder Beginner Contest 087-C] 문제풀이 보고서(단순dp)
C - Candies
Time limit : 2sec/ Memory limit : 256MB
Score : 300 points
Problem Statement
We have a 2×N grid. We will denote the square at the i-th row and j-th column (1≤i≤2, 1≤j≤N) as (i,j).
You are initially in the top-left square, (1,1). You will travel to the bottom-right square, (2,N), by repeatedly moving right or down.
The square (i,j) contains Ai,j candies. You will collect all the candies you visit during the travel. The top-left and bottom-right squares also contain candies, and you will also collect them.
At most how many candies can you collect when you choose the best way to travel?
Constraints
1≤N≤100
1≤Ai,j≤100 (1≤i≤2, 1≤j≤N)
Input
Input is given from Standard Input in the following format:
N
A1,1 A1,2 … A1,N
A2,1 A2,2 … A2,N
Output
Print the maximum number of candies that can be collected.
Sample Input 1
Copy
5
3 2 2 4 1
1 2 2 2 1
Sample Output 1
Copy
14
The number of collected candies will be maximized when you:
move right three times, then move down once, then move right once.
Sample Input 2
Copy
4
1 1 1 1
1 1 1 1
Sample Output 2
Copy
5
You will always collect the same number of candies, regardless of how you travel.
Sample Input 3
Copy
7
3 3 4 5 4 5 3
5 3 4 4 2 3 2
Sample Output 3
Copy
29
Sample Input 4
Copy
1
2
3
Sample Output 4
Copy
5
[제목 대의]
2*N 칸으로 각 칸마다 양초의 수량이 다릅니다.매번 오른쪽이나 아래로 내려가기만 하면 (1,1)에서 (2,N)까지 최대 몇 개의 촛불(처음과 끝 포함)을 모을 수 있는지 물어본다.
[문제풀이 사고방식]
입문 DP, 2*N으로 간소화, 상태 이동 방정식: dp[i][j]=max(dp[i-1][j], dp[i][j-1])+a[i][j]
[문제풀이 코드]
#include
#include
#include
using namespace std;
//dp dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j]
const int maxn=1e2+10;
int n;
int a[maxn][maxn];
int dp[maxn][maxn];
int max(int a,int b)
{
return a>b?a:b;
}
void solve()
{
dp[1][1]=a[1][1];
for(int i=1;i<=2;i++)
{
for(int j=1;j<=n;j++)
{
if(i==1)
dp[i][j]=dp[i][j-1]+a[i][j];
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
}
int main()
{
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for(int i=1;i<=2;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
solve();
printf("%d
",dp[2][n]);
}
return 0;
}
[수확과 반성]
첫 번째 작은 경기에서 실전에 dp를 응용했는데 신을 보면 모두 dp초로 사고방식이 정확하다는 것을 설명한다.상태 이동 방정식을 잘 쓰면 돼.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VSCode + atcoder-cli 환경 내에서 AtCoder 디버그 환경 구축.반년 정도 하지 않았던 경프로를 다시 시작할 때 환경 구축을 했습니다. 지금까지는 Python에서 Print 디버깅을 하고 있는 몸이었지만, 환경 구축까지 한다면 차라리 C++로 환승하려고 하는 것으로 C++로 했습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.