스키
7362 단어 OJ
i][j]=max(네 방향점)+1;네 방향의 점이 존재해야 하며 i, j보다 크면 i, j로 시작하는 점의 가장 긴 경로를 나타낸다. 귀속의 끝 조건은 판단할 필요가 없다. 왜냐하면
dp[][]의 최대 위치는 틀림없이 바로 끝날 것이다. 그 다음에 큰 값은 반드시 끝날 것이다. 이런 식으로 추측하기 때문에 실행할 수 있지만 아래에서 위로 동태적인 계획은 쓰기 어렵다.이 수의 크기를 확인해야 하기 때문에, 번거롭다.
#include<iostream>
#include<memory.h>
using namespace std;
int dp[101][101];
int arr[101][101];
int c;
int r;
int x[]={0,1,0,-1};
int y[]={1,0,-1,0};
bool isvalid(int row,int col,int r_off,int c_off) // , arr[i][j]
{
int newr=row+r_off;
int newc=col+c_off;
if(newr>=0&&newr<r&&newc>=0&&newc<c&&arr[row][col]<arr[newr][newc])
{
return true;
}
return false;
}
int fun(int row,int col)
{
int tem=0;
for(int i=0;i<4;i++)
{
if(isvalid(row,col,x[i],y[i]))
{
int tfun=fun(row+x[i],col+y[i]);
if(tem<tfun)
{
tem=tfun;
}
}
}
return tem+1;
}
// , ,dp
int fun2(int row,int col)
{
if(dp[row][col]>0) return dp[row][col];
int tem=0;
for(int i=0;i<4;i++)
{
if(isvalid(row,col,x[i],y[i]))
{
int tfun=fun(row+x[i],col+y[i]);
dp[row+x[i]][col+y[i]]=tfun;
if(tem<tfun)
{
tem=tfun;
}
}
}
return tem+1;
}
int main()
{
int len;
cin>>len;
while(len--)
{
memset(dp,0,sizeof(dp));
cin>>r>>c;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>arr[i][j];
}
}
int max=0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
int tem= fun2(i,j); // i,j
if(max<tem) max=tem;
}
}
cout<<max<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdoj1006--Tick and Tick
A hand is happy if it is at least D degrees from any of the rest.
Input
The input is terminated with a D of -1.
For each...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include<iostream>
#include<memory.h>
using namespace std;
int dp[101][101];
int arr[101][101];
int c;
int r;
int x[]={0,1,0,-1};
int y[]={1,0,-1,0};
bool isvalid(int row,int col,int r_off,int c_off) // , arr[i][j]
{
int newr=row+r_off;
int newc=col+c_off;
if(newr>=0&&newr<r&&newc>=0&&newc<c&&arr[row][col]<arr[newr][newc])
{
return true;
}
return false;
}
int fun(int row,int col)
{
int tem=0;
for(int i=0;i<4;i++)
{
if(isvalid(row,col,x[i],y[i]))
{
int tfun=fun(row+x[i],col+y[i]);
if(tem<tfun)
{
tem=tfun;
}
}
}
return tem+1;
}
// , ,dp
int fun2(int row,int col)
{
if(dp[row][col]>0) return dp[row][col];
int tem=0;
for(int i=0;i<4;i++)
{
if(isvalid(row,col,x[i],y[i]))
{
int tfun=fun(row+x[i],col+y[i]);
dp[row+x[i]][col+y[i]]=tfun;
if(tem<tfun)
{
tem=tfun;
}
}
}
return tem+1;
}
int main()
{
int len;
cin>>len;
while(len--)
{
memset(dp,0,sizeof(dp));
cin>>r>>c;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>arr[i][j];
}
}
int max=0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
int tem= fun2(i,j); // i,j
if(max<tem) max=tem;
}
}
cout<<max<<endl;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdoj1006--Tick and TickA hand is happy if it is at least D degrees from any of the rest. Input The input is terminated with a D of -1. For each...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.