똑똑한kk[DP]
2930 단어 dp
똑똑하다
시간 제한:
1000ms | 메모리 제한:
65535 KB
묘사
똑똑한 "KK"
아프리카의 한 나라 전시관의 디자인 영감은 전설적인 색채가 풍부한 사막에서 갑자기 기복하는 모래언덕에서 비롯되었고 자국의 끊임없는 변화와 현란하고 다채로운 자연 경치와 도시 풍경을 나타냈다.전시관은 다섯 부분으로 구성되어 있으며, 관내 영화관에서 이라는 와이드 스크린 단편영화를 방영하는 것은 건국 이래 국민들의 생활 수준과 도시 거주 환경의 놀라운 변화를 반영하였다.
'모래언덕'마술의 영감은 독특하고 웅장한 자연 경관인 전설적인 색채가 풍부한 험준한 모래언덕에서 비롯되었다.웅장한 구조, 순환 가능한 건축 자재는 대자연과 더욱 잘 어울린다.한 바퀴 돌면서 그것이 바로 모래언덕의 끊임없이 변화하는 형태에서 영감을 얻는 것을 발견했다.외형은 어느 각도에서 관찰하든지 모래언덕의 특징을 똑똑히 식별할 수 있을 정도로 생동감이 넘친다.
그것의'비탈면'은 높이가 20미터에 달하는데, 미풍이 불어오는데, 너는 모래의 흐름을 느꼈니?손으로 건드렸더니 마술 마술이었다.그 표면의 스테인리스강 패널은 변화무쌍한 색채를 나타내고 서로 다른 각도에서 관찰하여 서로 다른 색채와 광택을 나타내기 때문에 흐르는 모래언덕의 광감을 모방한다.
세 번째 전시장에 들어서면 커다란 스크린이 있는데 기묘한 필터를 통해 관중들이 마치 직접 드넓은 사막에 온 것 같다.더욱 기묘한 것은 작은 동물'KK'가 사막 지역(사각형)의 왼쪽 상단에서 오른쪽이나 아래쪽 방향을 따라 오른쪽 하단으로 달리고 있는 것이 보였다.KK는 너무 똑똑해서 달리는 과정에서 가능한 한 많은 벌레를 먹는 선로를 선택할 수 있다.
너는 그것이 얼마나 많은 벌레를 먹었는지 아니?
입력
첫 줄: N M (1≤ N M ≤ 20 0 ≤ Xij ≤500 (i=1,2 치)
) 사막이 N*M의 사각형 영역임을 나타냅니다.
다음은 N줄: 줄마다 M개의 정수가 있고, Xi1 Xi2...Xim은 각 위치의 벌레 수를 표시한다(한 칸으로 칸막이)
KK는 오른쪽이나 아래로만 갈 수 있다고 가정하십시오.
출력
출력에는'KK'가 가장 많이 먹은 벌레의 수를 나타내는 정수가 있다.
샘플 입력
3 4
3 1 2 8
5 3 4 6
1 0 2 3
샘플 출력
24
/* 문제 풀이:
처음에 DFS로 만들었는데 아무리 고쳐도 시간 초과였는데 나중에 인터넷에서 찾아보니 의외로 가장 기초적인 dp문제라는 것을 깨달았다
*/
AC 코드:
#include<cstdio>
#include<cstring>
int max(int a,int b)
{
return a>b ? a:b;
}
int main()
{
int n,m,i,j,a[22][22];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
a[i][j]=a[i][j]+max(a[i-1][j],a[i][j-1]);
}
}
printf("%d
",a[n][m]);
}
}
DFS 시간 초과:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,s,ans;
int a[22][22],dir[2][2]={{0,1},{1,0}},vis[22][22];
void dfs(int x,int y)
{
if(x==n-1&&y==m-1)
{
ans=max(ans,s);
return;
}
if(x<0||y<0||x>=n||y>=m) return;
for(int i=0; i<2; i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx>=0&&yy>=0&&xx<n&&yy<m&&!vis[xx][yy])
{
vis[xx][yy]=1;
s+=a[xx][yy];
}
dfs(xx,yy);
s-=a[xx][yy];
vis[xx][yy]=0;
}
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=0;i<n; i++)
{
for(int j=0; j<m; j++)
{
scanf("%d",&a[i][j]);
}
}
memset(vis,0,sizeof(vis));
s=a[0][0];
ans=s;
dfs(0,0);
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.