HLOJ430 쌍탑 구축
3689 단어 dp문제풀이듀얼 프로세스 DP
제목의 뜻
고정된 높이가 있는 네모난 덩어리로 두 개의 같은 높이의 탑을 쌓아 탑의 최고 높이를 물었다.
상태 이동 방정식
이중 프로세스 dp
f[j][k]는 한 탑의 높이가 j이고 다른 탑의 높이가 k인 경우 f[j][k]는 한 탑의 높이가 j이고 다른 탑의 높이가 k인 경우 존재하는지 여부를 나타낸다
우리는 쉽게 얻을 수 있다.
f[j][k]=f[j−a[i]][k] || f[j][k−a[i]] f [ j ] [ k ] = f [ j − a [ i ] ] [ k ] | | f [ j ] [ k − a [ i ] ]
code
#include
using namespace std;
inline int read()
{
int num = 0;
char c = ' ';
bool flag = true;
for(;c > '9' || c < '0';c = getchar())
if(c == '-')
flag = false;
for(;c >= '0' && c <= '9';num = num*10+c-48,c=getchar());
return flag ? num : -num;
}
const int maxn=105;
int n,a[maxn],sum=0;
void init()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read(),sum+=a[i];
}
const int max_height=2020;
bool f[max_height][max_height];
void DP()
{
f[0][0]=true;
for(int i=1;i<=n;i++)
for(int j=sum-a[i];j>=0;j--)
for(int k=sum-a[i];k>=0;k--)
if(f[j][k])
{
f[j+a[i]][k]=f[j][k+a[i]]=true;
}
for(int i=sum/2;i>=1;i--)
if(f[i][i])
{
printf("%d
",i);
exit(0);
}
printf("Impossible
");
}
int main()
{
init();
DP();
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.