uva104 (DP + floyd)
사고방식:DP를 이용하여 i에서 j까지 l개국을 거쳐 얻은 돈을 구한다.그러면 dp[i][j][1]은 i에서 j 국가 간의 환율을 나타내기 때문에 dp[i][j][l]=max(dp[i][j][l], dp[i][k][l-1]*dp[k][j]]를 나타낸다.만약에 한 나라에서 이 나라로 돌아가는 돈을 만족시키는 > 1.01이 나타나면 순환에서 물러난다. 그러면 도경을 보장할 수 있는 국가가 가장 적고 가장 짧은 경로를 찾을 수 있기 때문이다.코드:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
const int N =25;
double dp[N][N][N],p[N][N][N];
int n;
void print(int i,int j,int l) {
if(l == 0){
printf("%d",i);
return;
}
print(i,p[i][j][l],l - 1);
printf(" %d",j);
return;
}
void DP() {
int l;
int m;
for(l = 2; l <= n; l++) {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++)
if(dp[i][j][l] < dp[i][k][l - 1] *dp[k][j][1]) {
dp[i][j][l] = dp[i][k][l - 1]*dp[k][j][1];
p[i][j][l] = k;
}
int i;
for(i = 1; i <= n; i++)
if(dp[i][i][l] > 1.01) {
m = i;
break;
}
if(i <= n)
break;
}
if(l > n)
printf("no arbitrage sequence exists");
else
print(m,m,l);
printf("
");
}
int main() {
while(scanf("%d",&n) != EOF) {
memset(dp,0,sizeof(dp));
memset(p,-1,sizeof(p));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(i == j)
dp[i][j][1] = 1;
else
scanf("%lf",&dp[i][j][1]);
p[i][j][1] = j;
}
DP();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.