POJ 2609 Ferry Loading 듀얼 타워 DP

1875 단어
제목: l 길이의 차고 두 개를 가장 많이 수용할 수 있는 차로 구하고, 한 대가 들어가지 않으면 정지한다.
방법: 쌍탑 DP야, 단지 이번에 선택한 상태는 두 탑의 높이야. 최종 탑의 높이와 차에 넣은 수량을 기록하는 데 쓰인다.
DFS에서 왠지 모르게 조건 하나를 빼면 A예요. 신에게 설명해 주세요.
#include<cstdio>
#include<cstring>
const int LMT=10007;
bool dp[2][LMT];
int car[502],sum[502];
int pre[502][LMT];
inline int min(int a,int b)
{
	return a<b?a:b;
}
inline int max(int a,int b)
{
	return a>b?a:b;
}
void dfs(int x,int y)
{
	if(x<=0)return;//     。。  ||Y〈=0  ,       
	if(!pre[x][y])
	{
		dfs(x-1,y-car[x]);
		printf("starboard
"); } else { dfs(x-1,y); printf("port
"); } } int main(void) { int len,i,j,d,h,cnt=0,ans=0; scanf("%d",&len); len*=100; memset(dp,0,sizeof(dp)); memset(pre,-1,sizeof(pre)); dp[0][0]=1;sum[0]=0; for(i=1;;i++) { scanf("%d",&car[i]); if(0==car[i])break; sum[i]=sum[i-1]+car[i]; cnt++; } for(i=1;i<=cnt;i++) { memset(dp[i&1],0,sizeof(dp[i&1])); for(j=len;j>=0;j--) { if(sum[i]-j>len)break; if(j>=car[i]&&dp[(i-1)&1][j-car[i]])// { dp[i&1][j]|=dp[(i-1)&1][j-car[i]]; if(dp[i&1][j]) pre[i][j]=0; } else if(sum[i]-j>=car[i]) { dp[i&1][j]|=dp[(i-1)&1][j]; if(dp[i&1][j]) pre[i][j]=1; } if(dp[i&1][j]) { ans=d=i; h=j; } } if(ans!=i)break; } printf("%d
",ans); if(ans) dfs(d,h); return 0; }

좋은 웹페이지 즐겨찾기