I2luY2x1ZGUmbHQ7c3RkaW8uaCZndDsKI2luY2x1ZGUmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlJmx0O21hdGguaCZndDsKCiNpZm5kZWYgYm9vbAojZGVmaW5lIGJvb2wgaW50CiNlbmRpZgoKI2lmbmRlZiB0cnVlCiNkZWZpbmUgdHJ1ZSAxCiNlbmRpZgoKI2lmbmRlZiBmYWxzZQojZGVmaW5lIGZhbHNlIDAKI2VuZGlmCgpzdHJ1Y3Qgc3RhdGUKewppbnQgdmFsdWU7Ly/mnIDlsI/mmYLplpPjgpLoqJjmhrYKYm9vbCBpbmZpbml0eV9wOy8v54Sh6ZmQ5aSn44Gu5pmC6ZaT44KS6KiY5oa2CmJvb2wgc29sdmVkX3A7LyrnirbmhYvjgajjgZfjgabjgZ3jgZPjgavoh7PjgovmnIDlsI/mmYLplpPjgpLoqIjnrpfjgafjgY3jgovjgYvjganjgYbjgYvjgpLmjIHjgaQKICAgICAgICAgICAgICAgIOOBp+OBjeOBpuOBhOOCjOOBsHRydWUg44Gd44GG44Gn44Gq44GR44KM44GwZmFsc2UqLwpib29sIG9sZEtfcDsvL+iHquWIhuOBruWJjeOBrueKtuaFi+OBjCBpPT1rIOOBp+OBguOBo+OBn+OBiwpib29sIG9sZEpfcDsvL+iHquWIhuOBruWJjeOBrueKtuaFi+OBjCBpPT1qIOOBp+OBguOBo+OBn+OBiwp9OwoKc3RydWN0IHN0YXRlcwp7CnN0cnVjdCBzdGF0ZSAqc3RhdGVBcnJheTsKaW50ICp4LCpyLG47Cn07Cgp2b2lkIGluaXRpYWxpemUoc3RydWN0IHN0YXRlcyAqc3MpOwp2b2lkIGlucHV0RGF0YShzdHJ1Y3Qgc3RhdGVzICpzcyk7CnZvaWQgcHJpbnRTdGF0ZShzdHJ1Y3Qgc3RhdGVzICpzcyk7CiB2b2lkIHByaW50MVN0YXRlKHN0cnVjdCBzdGF0ZXMgKnNzLGludCBqLGludCBrLGludCBpKTsKIHZvaWQgcHJpbnQxU3RhdGVCZWZvcmUoc3RydWN0IHN0YXRlcyAqc3MsaW50IGosaW50IGssaW50IGkpOwogc3RydWN0IHN0YXRlICpnZXRTdGF0ZUFycmF5UHRyKHN0cnVjdCBzdGF0ZXMgKnNzLGludCBqLGludCBrLGludCBpamtfcCk7CnZvaWQgdHVybihzdHJ1Y3Qgc3RhdGVzICpzcyxpbnQgayk7CiB2b2lkIHR1cm4wKHN0cnVjdCBzdGF0ZXMgKnNzLGludCBqLGludCBrKTsKIHZvaWQgdHVybjEoc3RydWN0IHN0YXRlcyAqc3MsaW50IGosaW50IGspOwp2b2lkIHByaW50U29sdXRpb24oc3RydWN0IHN0YXRlcyAqc3MpOwp2b2lkIGZpbmFsaXplKHN0cnVjdCBzdGF0ZXMgKnNzKTsKCmludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKewpzdHJ1Y3Qgc3RhdGVzIHNzOwppbnQgazsKaW5pdGlhbGl6ZSgmYW1wO3NzKTsvL+mFjeWIl+OBruWIneacn+WMlgppbnB1dERhdGEoJmFtcDtzcyk7Ly/phY3liJfjga7nlKjmhI/jgah4LHLjga7lgKTjga7lhaXlipsKcHJpbnRTdGF0ZSgmYW1wO3NzKTsvL+ihqOWHuuWKmwovL2ZvcihrPXNzLm4rMTsgayZndDs9MTsgay0tKQovLyB7Ci8vIHR1cm4oJmFtcDtzcyxrKTsKLy8gcHJpbnRTdGF0ZSgmYW1wO3NzKTsKLy8gfQpwcmludFNvbHV0aW9uKCZhbXA7c3MpOwpmaW5hbGl6ZSgmYW1wO3NzKTsKcmV0dXJuIDA7Cn0KCnZvaWQgaW5pdGlhbGl6ZShzdHJ1Y3Qgc3RhdGVzICpzcykKewpzcy0mZ3Q7eD1OVUxMOwpzcy0mZ3Q7cj1OVUxMOwpzcy0mZ3Q7c3RhdGVBcnJheT1OVUxMOwp9Cgp2b2lkIGlucHV0RGF0YShzdHJ1Y3Qgc3RhdGVzICpzcykKewppbnQgaSxqLGssbjsKc2NhbmYoJnF1b3Q7JWQmcXVvdDssJmFtcDtzcy0mZ3Q7bik7IG49c3MtJmd0O247CiBzcy0mZ3Q7eD0oaW50ICopbWFsbG9jKCgoc3MtJmd0O24pKzEpKnNpemVvZihpbnQpKTsKIHNzLSZndDtyPShpbnQgKiltYWxsb2MoKChzcy0mZ3Q7bikrMSkqc2l6ZW9mKGludCkpOwogc3MtJmd0O3N0YXRlQXJyYXk9KHN0cnVjdCBzdGF0ZSAqKW1hbGxvYygoKHNzLSZndDtuKSsyKSoyKnNpemVvZihzdHJ1Y3Qgc3RhdGUpKTsKc3MtJmd0O3hbMF09MDsgc3MtJmd0O3JbMF09MDsKZm9yKGk9MTsgaSZsdDs9c3MtJmd0O247IGkrKykvL3gscuOCkuWFpeWKmwogewogc2NhbmYoJnF1b3Q7JWQmcXVvdDssJmFtcDtzcy0mZ3Q7eFtpXSk7CiBzY2FuZigmcXVvdDslZCZxdW90OywmYW1wO3NzLSZndDtyW2ldKTsKIH0KZm9yKGo9MDsgaiZsdDtuOyBqKyspLy9zdGF0ZUFycmF544KS5Yid5pyf5YyWCiB7CiBmb3IoaT0wOyBpJmx0Oz0xOyBpKyspCiAgewogIGZvcihrPTE7IGsmbHQ7PW4rMTsgaysrKQogICB7CiAgIGdldFN0YXRlQXJyYXlQdHIoc3MsaixrLGkpLSZndDt2YWx1ZT0wOwogICBnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7aW5maW5pdHlfcD1mYWxzZTsKICAgZ2V0U3RhdGVBcnJheVB0cihzcyxqLGssaSktJmd0O3NvbHZlZF9wPWZhbHNlOwogICBnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7b2xkS19wPWZhbHNlOwogICBnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7b2xkSl9wPWZhbHNlOwoKICAgfQogIC8vcHJpbnRmKCZxdW90O1xuJnF1b3Q7KTsKICB9CiB9CmZvcihqPTA7IGombHQ7PW47IGorKykvL3N0YXRlQXJyYXnjga7looPnlYzlgKToqK3lrpoKIHsKIGdldFN0YXRlQXJyYXlQdHIoc3MsaixuKzEsMSktJmd0O2luZmluaXR5X3A9dHJ1ZTsKIGdldFN0YXRlQXJyYXlQdHIoc3MsaixuKzEsMSktJmd0O3NvbHZlZF9wPXRydWU7CiB9CmZvcihrPTE7IGsmbHQ7PW4rMTsgaysrKQogewogZ2V0U3RhdGVBcnJheVB0cihzcywwLGssMCktJmd0O2luZmluaXR5X3A9dHJ1ZTsKIGdldFN0YXRlQXJyYXlQdHIoc3MsMCxrLDApLSZndDtzb2x2ZWRfcD10cnVlOwogfQovKnN0YXRlQXJyYXnjga7liJ3mnJ/oqK3lrpoqLwpnZXRTdGF0ZUFycmF5UHRyKHNzLDEsbisxLDApLSZndDt2YWx1ZT1zcy0mZ3Q7clsxXTsKZ2V0U3RhdGVBcnJheVB0cihzcywxLG4rMSwwKS0mZ3Q7c29sdmVkX3A9dHJ1ZTsKZ2V0U3RhdGVBcnJheVB0cihzcywwLG4rMSwxKS0mZ3Q7dmFsdWU9c3MtJmd0O3Jbbl07CmdldFN0YXRlQXJyYXlQdHIoc3MsMCxuKzEsMSktJmd0O3NvbHZlZF9wPXRydWU7CnJldHVybjsKfQoKLy/ooajlh7rlipvplqLmlbAKdm9pZCBwcmludFN0YXRlKHN0cnVjdCBzdGF0ZXMgKnNzKQp7CmludCBpLGosayxuOyBuPXNzLSZndDtuOwoJLyrjgZPjgZPjgagqLwoJZm9yKGo9MDsgaiZsdDtuOyBqKyspCiB7CiBmb3IoaT0wOyBpJmx0Oz0xOyBpKyspCiAgewogIGZvcihrPTE7IGsmbHQ7PW4rMTsgaysrKQogICB7CiAgIGlmKGZhbHNlPT0oZ2V0U3RhdGVBcnJheVB0cihzcyxqLGssaSktJmd0O3NvbHZlZF9wKSkgcHJpbnRmKCZxdW90OyAsLCZxdW90Oyk7CiAgIGVsc2UgcHJpbnRmKCZxdW90OyoqJnF1b3Q7KTsKICAgfQogIHByaW50ZigmcXVvdDtcbiZxdW90Oyk7CiAgfQogfQogIHByaW50ZigmcXVvdDtcbiZxdW90Oyk7CnByaW50ZigmcXVvdDsuJnF1b3Q7KTsKZm9yKGs9MTsgayZsdDs9KG4rMSk7IGsrKykgcHJpbnRmKCZxdW90OyxrPSVkLGJlZm9yZSZxdW90OyxrKTsKcHJpbnRmKCZxdW90O1xuJnF1b3Q7KTsKZm9yKGo9MDsgaiZsdDs9bjsgaisrKQogewogZm9yKGk9MDsgaSZsdDs9MTsgaSsrKQogIHsKICBwcmludGYoJnF1b3Q7aj0lZCZxdW90OyxqKTsKICBpZigwPT1pKXByaW50ZigmcXVvdDssaT1qJnF1b3Q7KTsKICBlbHNlIHByaW50ZigmcXVvdDssaT1rJnF1b3Q7KTsKICBmb3Ioaz0xOyBrJmx0Oz1uKzE7IGsrKykgcHJpbnQxU3RhdGUoc3MsaixrLGkpOwogIHByaW50ZigmcXVvdDtcbiZxdW90Oyk7CiAgfQogfQpwcmludGYoJnF1b3Q7XG5cblxuJnF1b3Q7KTsKfQoKdm9pZCBwcmludDFTdGF0ZShzdHJ1Y3Qgc3RhdGVzICpzcyxpbnQgaixpbnQgayxpbnQgaSkKewoJLyrjgZPjgZMqLwppbnQgYSxiLGMsbjsgYT1qOyBiPWs7IGM9aTsgbj1zcy0mZ3Q7bjsgCmlmKGo9PTAmYW1wOyZhbXA7az09MSkKewpmb3Ioaj0wOyBqJmx0O247IGorKykvL3N0YXRlQXJyYXnjgpLliJ3mnJ/ljJYKIHsKIGZvcihpPTA7IGkmbHQ7PTE7IGkrKykKICB7CiAgZm9yKGs9MTsgayZsdDs9bisxOyBrKyspCiAgIHsKICAgaWYoZmFsc2U9PShnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7c29sdmVkX3ApKSBwcmludGYoJnF1b3Q7ICwsJnF1b3Q7KTsKICAgZWxzZSBwcmludGYoJnF1b3Q7KiomcXVvdDspOwogICB9CiAgcHJpbnRmKCZxdW90O1xuJnF1b3Q7KTsKICB9CiB9CiAgcHJpbnRmKCZxdW90O1xuJnF1b3Q7KTsKICBqPWE7IGs9YjsgaT1jOwp9CnByaW50ZigmcXVvdDsgJWQsJWQsJWQgJnF1b3Q7LGosayxpKTsKaWYoZmFsc2U9PShnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7c29sdmVkX3ApKSBwcmludGYoJnF1b3Q7LCwmcXVvdDspOwplbHNlIGlmKHRydWU9PShnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7aW5maW5pdHlfcCkpIHByaW50ZigmcXVvdDssaW5mLCZxdW90Oyk7CmVsc2V7CglwcmludGYoJnF1b3Q7LCVkJnF1b3Q7LChnZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7dmFsdWUpKTsKICAgIHByaW50MVN0YXRlQmVmb3JlKHNzLGosayxpKTsvL+OBvuOBoOOBhOOCieOBquOBhAogICAgfQpyZXR1cm47Cn0KCnZvaWQgcHJpbnQxU3RhdGVCZWZvcmUoc3RydWN0IHN0YXRlcyAqc3MsaW50IGosaW50IGssaW50IGkpCnsvL+OBsuOBqOOBpOOBrueKtuaFi+OBruWJjeOBrueKtuaFi+OBjOOBqeOCjOOBp+OBguOCi+OBi+abuOOBjwppZih0cnVlPT1nZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7b2xkSl9wKQogewogaWYodHJ1ZT09Z2V0U3RhdGVBcnJheVB0cihzcyxqLGssaSktJmd0O29sZEtfcCkgcHJpbnRmKCZxdW90OyxqPWprJnF1b3Q7KTsKIGVsc2UgcHJpbnRmKCZxdW90OyxpPWomcXVvdDspOwogfQplbHNlCiB7CiBpZih0cnVlPT1nZXRTdGF0ZUFycmF5UHRyKHNzLGosayxpKS0mZ3Q7b2xkS19wKSBwcmludGYoJnF1b3Q7LGk9ayZxdW90Oyk7CiBlbHNlIHByaW50ZigmcXVvdDssJnF1b3Q7KTsKIH0KcmV0dXJuOwp9CgpzdHJ1Y3Qgc3RhdGUgKmdldFN0YXRlQXJyYXlQdHIoc3RydWN0IHN0YXRlcyAqc3MsaW50IGosaW50IGssaW50IGlqa19wKQp7Ci8v54q25oWL44Gu44Od44Kk44Oz44K/44O844KS6L+U44GZ44CCaWprX3A6IDAgaWYoaT09aikgZWxzZSAxIGlmKGk9PWspCnJldHVybigoc3MtJmd0O3N0YXRlQXJyYXkpK2oqKChzcy0mZ3Q7bikrMikqMitrKjIraWprX3ApOwp9CgovL3R1cm4Kdm9pZCB0dXJuKHN0cnVjdCBzdGF0ZXMgKnNzLGludCBrKQp7Ly9EUOeKtuaFi+OBrmvjgavlr77jgZnjgovmm7TmlrAKaW50IGosbm47Cm5uPXNzLSZndDtuOwpmb3Ioaj0wOyBqJmx0O2s7IGorKykKIHsKIGlmKGombHQ7ayl7CgkgICAgdHVybjAoc3MsaixrKTsKCQl0dXJuMShzcyxqLGspOwogICAgICAgIH0KIH0KcmV0dXJuOwp9Cgp2b2lkIHR1cm4wKHN0cnVjdCBzdGF0ZXMgKnNzLGludCBqLGludCBrKQp7Cn0KCnZvaWQgdHVybjEoc3RydWN0IHN0YXRlcyAqc3MsaW50IGosaW50IGspCnsKfQoKdm9pZCBwcmludFNvbHV0aW9uKHN0cnVjdCBzdGF0ZXMgKnNzKQp7Cn0KCnZvaWQgZmluYWxpemUoc3RydWN0IHN0YXRlcyAqc3MpCnsKfQo=
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#ifndef bool
#define bool int
#endif
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
struct state
{
int value;//最小時間を記憶
bool infinity_p;//無限大の時間を記憶
bool solved_p;/*状態としてそこに至る最小時間を計算できるかどうかを持つ
できていればtrue そうでなければfalse*/
bool oldK_p;//自分の前の状態が i==k であったか
bool oldJ_p;//自分の前の状態が i==j であったか
};
struct states
{
struct state *stateArray;
int *x,*r,n;
};
void initialize(struct states *ss);
void inputData(struct states *ss);
void printState(struct states *ss);
void print1State(struct states *ss,int j,int k,int i);
void print1StateBefore(struct states *ss,int j,int k,int i);
struct state *getStateArrayPtr(struct states *ss,int j,int k,int ijk_p);
void turn(struct states *ss,int k);
void turn0(struct states *ss,int j,int k);
void turn1(struct states *ss,int j,int k);
void printSolution(struct states *ss);
void finalize(struct states *ss);
int main(int argc,char *argv[])
{
struct states ss;
int k;
initialize(&ss);//配列の初期化
inputData(&ss);//配列の用意とx,rの値の入力
printState(&ss);//表出力
//for(k=ss.n+1; k>=1; k--)
// {
// turn(&ss,k);
// printState(&ss);
// }
printSolution(&ss);
finalize(&ss);
return 0;
}
void initialize(struct states *ss)
{
ss->x=NULL;
ss->r=NULL;
ss->stateArray=NULL;
}
void inputData(struct states *ss)
{
int i,j,k,n;
scanf("%d",&ss->n); n=ss->n;
ss->x=(int *)malloc(((ss->n)+1)*sizeof(int));
ss->r=(int *)malloc(((ss->n)+1)*sizeof(int));
ss->stateArray=(struct state *)malloc(((ss->n)+2)*2*sizeof(struct state));
ss->x[0]=0; ss->r[0]=0;
for(i=1; i<=ss->n; i++)//x,rを入力
{
scanf("%d",&ss->x[i]);
scanf("%d",&ss->r[i]);
}
for(j=0; j<n; j++)//stateArrayを初期化
{
for(i=0; i<=1; i++)
{
for(k=1; k<=n+1; k++)
{
getStateArrayPtr(ss,j,k,i)->value=0;
getStateArrayPtr(ss,j,k,i)->infinity_p=false;
getStateArrayPtr(ss,j,k,i)->solved_p=false;
getStateArrayPtr(ss,j,k,i)->oldK_p=false;
getStateArrayPtr(ss,j,k,i)->oldJ_p=false;
}
//printf("\n");
}
}
for(j=0; j<=n; j++)//stateArrayの境界値設定
{
getStateArrayPtr(ss,j,n+1,1)->infinity_p=true;
getStateArrayPtr(ss,j,n+1,1)->solved_p=true;
}
for(k=1; k<=n+1; k++)
{
getStateArrayPtr(ss,0,k,0)->infinity_p=true;
getStateArrayPtr(ss,0,k,0)->solved_p=true;
}
/*stateArrayの初期設定*/
getStateArrayPtr(ss,1,n+1,0)->value=ss->r[1];
getStateArrayPtr(ss,1,n+1,0)->solved_p=true;
getStateArrayPtr(ss,0,n+1,1)->value=ss->r[n];
getStateArrayPtr(ss,0,n+1,1)->solved_p=true;
return;
}
//表出力関数
void printState(struct states *ss)
{
int i,j,k,n; n=ss->n;
/*ここと*/
for(j=0; j<n; j++)
{
for(i=0; i<=1; i++)
{
for(k=1; k<=n+1; k++)
{
if(false==(getStateArrayPtr(ss,j,k,i)->solved_p)) printf(" ,,");
else printf("**");
}
printf("\n");
}
}
printf("\n");
printf(".");
for(k=1; k<=(n+1); k++) printf(",k=%d,before",k);
printf("\n");
for(j=0; j<=n; j++)
{
for(i=0; i<=1; i++)
{
printf("j=%d",j);
if(0==i)printf(",i=j");
else printf(",i=k");
for(k=1; k<=n+1; k++) print1State(ss,j,k,i);
printf("\n");
}
}
printf("\n\n\n");
}
void print1State(struct states *ss,int j,int k,int i)
{
/*ここ*/
int a,b,c,n; a=j; b=k; c=i; n=ss->n;
if(j==0&&k==1)
{
for(j=0; j<n; j++)//stateArrayを初期化
{
for(i=0; i<=1; i++)
{
for(k=1; k<=n+1; k++)
{
if(false==(getStateArrayPtr(ss,j,k,i)->solved_p)) printf(" ,,");
else printf("**");
}
printf("\n");
}
}
printf("\n");
j=a; k=b; i=c;
}
printf(" %d,%d,%d ",j,k,i);
if(false==(getStateArrayPtr(ss,j,k,i)->solved_p)) printf(",,");
else if(true==(getStateArrayPtr(ss,j,k,i)->infinity_p)) printf(",inf,");
else{
printf(",%d",(getStateArrayPtr(ss,j,k,i)->value));
print1StateBefore(ss,j,k,i);//まだいらない
}
return;
}
void print1StateBefore(struct states *ss,int j,int k,int i)
{//ひとつの状態の前の状態がどれであるか書く
if(true==getStateArrayPtr(ss,j,k,i)->oldJ_p)
{
if(true==getStateArrayPtr(ss,j,k,i)->oldK_p) printf(",j=jk");
else printf(",i=j");
}
else
{
if(true==getStateArrayPtr(ss,j,k,i)->oldK_p) printf(",i=k");
else printf(",");
}
return;
}
struct state *getStateArrayPtr(struct states *ss,int j,int k,int ijk_p)
{
//状態のポインターを返す。ijk_p: 0 if(i==j) else 1 if(i==k)
return((ss->stateArray)+j*((ss->n)+2)*2+k*2+ijk_p);
}
//turn
void turn(struct states *ss,int k)
{//DP状態のkに対する更新
int j,nn;
nn=ss->n;
for(j=0; j<k; j++)
{
if(j<k){
turn0(ss,j,k);
turn1(ss,j,k);
}
}
return;
}
void turn0(struct states *ss,int j,int k)
{
}
void turn1(struct states *ss,int j,int k)
{
}
void printSolution(struct states *ss)
{
}
void finalize(struct states *ss)
{
}