순회 공연

제목은 여기~https://blog.csdn.net/fisher_jiang/article/details/810358
 
제목이 무섭게 길어서...
그러나 80퍼센트는 입력을 이야기하고 있다...(수동으로 피를 토한다)
사실 비교적 전형적인 dp
코드에 직접 로그인합니다: (측정할 곳이 없으니 아마 ac를 할 수 있을 것입니다)
#include 
#include 
#include 

using namespace std;

struct node
{
	int zq[30+5],len;//   i  zq[i] ,   len 
};

const int maxValue=0x7fffffff;
int n,k1;
node a[10+5][10+5];//a[i,j]: i j     
int f[10+5][1000+5];//f[i,j]: j   i       ,=-1     

void dp()
{
	int i,j,k,k2;
	
	f[1][0]=0;
	for (k=1;k<=k1;k++)// k  
	{
		for (i=1;i<=n;i++)//     
		{
			if (f[i][k-1]<0) 
				continue;
			for (j=1;j<=n;j++)//     
			{
				if (i==j)
					continue;
				k2=k%a[i][j].len;
				if (a[i][j].zq[k2]==0)
					continue;
					
				if (f[j][k]==-1)
					f[j][k]=maxValue;
				f[j][k]=min(f[j][k],f[i][k-1]+a[i][j].zq[k2]);
			}
		}
	}
	if (f[n][k1]==-1)
		printf("0
"); else printf("%d
",f[n][k1]); } int main() { int i,j,k,x,y; freopen("a.txt","r",stdin); while (1) { scanf("%d%d",&n,&k1); if (n==0) break; for (i=1;i<=n;i++) for (j=0;j<=k1;j++) f[i][j]=-1; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if (j==i) j++; if (j>n) break; scanf("%d",&x);// a[i][j].len=x; for (k=1;k<=x;k++) { scanf("%d",&y); if (k==x) a[i][j].zq[0]=y; else a[i][j].zq[k]=y; } // for (k=1;k<=x;k++) printf("%d ",a[i][j].zq[k]); // printf("
"); } } dp(); } return 0; }

좋은 웹페이지 즐겨찾기