UVA 590 Always on the run(dp)

1696 단어 onrunAlwaysuvathe590
제목: n개 도시, k편 항공편을 정하고 n*(n-1)줄을 입력하면,
i번 도시와 다른 도시의 항공편을 나타낸다. 0번은 당일 항공편이 없고 항공편이 형성되는 주기를 나타낸다.
도시 1에서 도시 n까지 적당한 k편을 요구합니다. 최소한 필요한 돈입니다.
사고방식: dp, dp[k][i]는 k편의 최소 비용을 거쳐 어느 도시에 도착하는지를 나타낸다.
i 대표 시간, j는 기점 도시, k는 종점 도시, k는 제k편 비행기를 나타낸다.
그러면 그 비행기의 시간은 now = i% edge[j][k]입니다.day;
가격은 dp[i-1][j]+edge[j][k]입니다.cost[now]
상태 전이 방정식은 dp[i][k]=min(dp[i][k], dp[i-1][j]+edge[j][k].cost[now])이다.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Edge {
	int day;
	int cost[35];
}edge[15][15];
int dp[1005][15];
int n,m;
int main() {
	int day,cost,cas = 1,flag = 0;
	while(scanf("%d%d",&n,&m) != EOF && (n || m)) {
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= n; j++) {
				if(i == j)
					continue;
				
				scanf("%d",&day);
				edge[i][j].day = day;

				for(int k = 1; k <= day; k++) {
					scanf("%d",&cost);
					edge[i][j].cost[k] = cost;
				}
			}
		memset(dp,INF,sizeof(dp));
		dp[0][1] = 0;
		for(int i = 1; i <= m; i++) {
			for(int j = 1; j <= n; j++) {
				for(int k = 1; k <= n; k++) {
					if(j != k) {
						int now = i % edge[j][k].day;
						if(now == 0) {
							now = edge[j][k].day;
						}
						if(edge[j][k].cost[now]) {
							dp[i][k] = min(dp[i][k],dp[i-1][j] + edge[j][k].cost[now]);
						}
					}
				}
			}
		}
		printf("Scenario #%d
",cas++); if(dp[m][n] == INF) { printf("No flight possible.
"); }else { printf("The best flight costs %d.
",dp[m][n]); } printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기