dp 의 최대 합,m 단 최대 및 최대 서브 매트릭스
우선 하위 꼬치 와... http://acm.nyist.net/JudgeOnline/problem.php?pid=44
매우 간단 하 다.바로 하나의 상태 전이 방정식 이다.구 한 마지막 하 나 는 가장 큰 것 이 아니 라 그 중에서 가장 큰 숫자 가 가장 큰 것 임 을 명심 하 라.
dp[i]=Max((dp[i-1]+a[i]),a[i]);
#include <cstdio>
#define Max(a,b) a>b?a:b
int a[1000010],dp[1000010];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%d",&a[0]);
int max=a[0];dp[0]=a[0];
for(int i=1;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=Max((dp[i-1]+a[i]),a[i]);
if(dp[i]>max)
max=dp[i];
}
printf("%d
",max);
}
}
내 려 오 면 m 단 과...http://acm.nyist.net/JudgeOnline/problem.php?pid=742 한 꼬치 를 m 단의 최대 합 으로 나 누 는 것 이다.
상태 전이 방정식 은 dp[i][j]=max(dp[i-1][t]),dp[i][j-1]+a[j],dp[i][j][j]는 문자열 의 앞 j 개 수 를 i 세그먼트 의 최대 와 나 누 어 dp 의 사상 으로 분석 하면 가장 좋 은 서브 구조 로 전환 된다.즉,현재 의 상 태 는 앞의 상태 에서 추정 된다.만약 에 현재 의 a[j]를 한 단락 으로 만 들 면 앞의 단락 에서 얻 을 수 있 는 최대 치 를 취한 다.그리고 스스로 한 단락 을 이 루 는 a[j]와 더 하면 max(dp[i-1][t]+a[j]입 니 다.앞의 것 과 함께 한 단락 이 되 려 면 dp[i][j-1])+a[j]입 니 다.사실은 잘 이해 합 니 다.
이 를 실현 하면 2 차원 배열 은 1 차원 배열 로 간략화 할 수 있다.즉,1 층 순환 으로 세그먼트 를 대체 한 다음 에 한 배열 로 이전 상황 의 최대 치 를 표시 한 다음 에 앞의 dp 방정식 을 직접 활용 하면 된다.코드:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e6+5;
const int MIN = -(1<<30);
int a[N];
int dp[N],pre[N];
int main()
{
int t,m,n,i,j,k;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(pre,0,sizeof(pre));
scanf("%d%d",&m,&n);
for(i = 1; i <= n; i++)
scanf("%d",&a[i]);
int sum;
for(i = 1; i <= m; i++)
{
sum = MIN;
for(j = i; j <=n; j++)
{
dp[j] = max(dp[j-1],pre[j-1]) + a[j];
pre[j-1] = sum;
sum = max(dp[j],sum);
}
pre[j-1] = sum;
}
printf("%d
",sum);
}
return 0;
}
마지막 으로 가장 큰 서브 매트릭스 입 니 다.가장 큰 것 과+매 거 진+매트릭스 압축 을 사용 합 니 다.http://acm.nyist.net/JudgeOnline/problem.php?pid=104
사실은 입력 할 때 각 줄 의 아래 수 를 아래로 구하 고 이 열 에 있 는 모든 수의 합 을 표시 한 다음 에 시작 줄 과 끝 줄 을 매 거 하여 최대 와 기 존 결 과 를 구 하 는 것 을 판단 하 는 것 이다.
코드:
#include <stdio.h>
#include <string.h>
int map[102][102];
int main()
{
int i,j,k,m,t,r,c,max,temp,cc=0;
scanf("%d",&t);
while(t--)
{
cc++;
scanf("%d%d",&r,&c);
for(i=1; i<=r; i++)
{
for(j=0; j<c; j++)
{
scanf("%d",&map[i][j]);
map[i][j]=map[i][j]+map[i-1][j];
}
}
for(i=1,m=map[1][0]; i<=r; i++)
for(j=i; j<=r; j++)
{
for(k=max=0; k<c; k++)
{
temp=map[j][k]-map[i-1][k];
max=(max>=0?max:0)+temp;
m=max>m?max:m;
}
}
printf("%d
",m);
memset(map,0,sizeof(map));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 수조를 깊이가 가장 낮은 두 갈래 나무로 바꾸다문제 정의: Givena sorted(increasing order) array, write an algorithm to create abinary tree with minimal height. 생각: 이 문제는 비...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.