poj 1179 매트릭스 체인 곱하기 괄호
사고방식: 매트릭스 곱셈으로 할 수 있고 순환도 비교적 잘 처리되는 것을 발견하고 다각형을 순서대로 한 번 복제하면 된다. 체인 곱셈의 최대 길이는 n을 구하면 된다.그러나 정점의 데이터가 마이너스일 수 있기 때문에 최대값은 마이너스가 플러스일 수 있기 때문에 매트릭스 체인의 최소값을 저장해야 한다.
#include <stdio.h>
#include <string.h>
#define INF 0x3fffffff
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define N 150
int n,op[N],dp[N][N][2],ans[N];//dp 0 ,
int dd(int x){
return (x<<1)-1;
}
int computemax(int i,int id,int j){
if(op[id])
return max(dp[i][id-1][1] * dp[id][j][1], dp[i][id-1][0]*dp[id][j][0]);
return dp[i][id-1][1] + dp[id][j][1];
}
int computemin(int i,int id,int j){
if(op[id])
return min(min(dp[i][id-1][0]*dp[id][j][1],dp[i][id-1][1]*dp[id][j][0]),dp[i][id-1][0]*dp[id][j][0]);
return dp[i][id-1][0] + dp[id][j][0];
}
int main(){
while (scanf("%d
",&n)!=EOF) {
char ch;
int i,j,p,k,res = -INF,num=0;
memset(dp,0,sizeof(dp));
for(i = 1;i<=n;i++){
scanf("%c %d ",&ch,&k);
dp[i][i][0] = dp[i][i][1] = dp[i+n][i+n][0] = dp[i+n][i+n][1] = k;
if(ch == 't')
op[i] = op[i+n] = 0;
else if(ch == 'x')
op[i] = op[i+n] = 1;
}
for(k = 1;k<n;k++)
for(i = 1;i<=dd(n)-k;i++){
j = i+k;
dp[i][j][0] = INF;
dp[i][j][1] = -INF;
for(p = i+1;p<=j;p++)
dp[i][j][0] = min(dp[i][j][0],computemin(i, p, j)),
dp[i][j][1] = max(dp[i][j][1],computemax(i, p, j));
}
for(i = 1;i<=n;i++){
if(dp[i][i+n-1][1] > res){
res = dp[i][i+n-1][1];
num = 0;
ans[num++] = i;
}else if(dp[i][i+n-1][1] == res)
ans[num++] = i;
}
printf("%d
",res);
for(i = 0;i<num;i++)
printf("%d ",ans[i]);
printf("
");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.