well mukesh ,
I solved the problem iteratively from right to left and filling up an arry.
Here is my code. I think Lago Haryanto was right. you have to select and
find out the lexicographically shortest path greedily.
Minhaz
code:
/* @JUDGE_ID: 55890 116 C++*/
#includestdio.h
void min3(int,int);
void dp(void);
void print(void);
struct datum{
long long cur_val;
long long cur_sum;
int nextro;
};
struct datum data[11][101];
int cur_ro,cur_col;
void main(){
int i,j;
while(scanf(%d,cur_ro)==1){
scanf(%d,cur_col);
for(i=1;i=cur_ro;i++){
for(j=1;j=cur_col;j++){
scanf(%lld,data[i][j].cur_val);
}
}
dp();
print();
}
}
void dp(void){
int i,j;
for(i=1;i=cur_ro;i++)
data[i][cur_col].cur_sum=data[i][cur_col].cur_val;
for(j=cur_col-1;j0;j--){
for(i=1;i=cur_ro;i++){
min3(i,j);
}
}
}
void min3(int row,int col){
int a,b,c;
long long sum_a,sum_b,sum_c;
b=row;
sum_b=data[row][col+1].cur_sum;
a=row-1;
c=row+1;
if(row==1)
a=cur_ro;
if(row==cur_ro)
c=1;
sum_a=data[a][col+1].cur_sum;
sum_c=data[c][col+1].cur_sum;
if(sum_asum_b){
if(sum_asum_c){
data[row][col].nextro=a;
data[row][col].cur_sum=sum_a+data[row][col].cur_val;
}
else if(sum_a==sum_c){
if(ac){
data[row][col].nextro=a;
data[row][col].cur_sum=sum_a+data[row][col].cur_val;
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else if(sum_a==sum_b){
if(ab){
if(sum_asum_c){
data[row][col].nextro=a;
data[row][col].cur_sum=sum_a+data[row][col].cur_val;
}
else if(sum_a==sum_c){
if(ac){
data[row][col].nextro=a;
data[row][col].cur_sum=sum_a+data[row][col].cur_val;
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else{
if(sum_bsum_c){
data[row][col].nextro=b;
data[row][col].cur_sum=sum_b+data[row][col].cur_val;
}
else if(sum_b==sum_c){
if(bc){
data[row][col].nextro=b;
data[row][col].cur_sum=sum_b+data[row][col].cur_val;
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
}
else{
if(sum_bsum_c){
data[row][col].nextro=b;
data[row][col].cur_sum=sum_b+data[row][col].cur_val;
}
else if(sum_b==sum_c){
if(bc){
data[row][col].nextro=b;
data[row][col].cur_sum=sum_b+data[row][col].cur_val;
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
else{
data[row][col].nextro=c;
data[row][col].cur_sum=sum_c+data[row][col].cur_val;
}
}
}
void print(void){
int min_ro,i;
long long min_sum;
if(cur_ro!=0)
min_ro=1;
else
min_ro=0;
if(cur_col!=0)
min_sum=data[1][1].cur_sum;
else
min_sum=0;
for(i=2;i=cur_ro;i++){
if(min_sumdata[i][1].cur_sum){
min_sum=data[i][1].cur_sum;
min_ro=i;
}
}
printf(%d,min_ro);
for(i=1;icur_col;i++){
min_ro=data[min_ro][i].nextro;
printf( %d,min_ro);
}
printf(\n%lld\n,min_sum);
}
On 12/13/06, mukesh tiwari [EMAIL PROTECTED] wrote:
hi Lego Haryanto
i tried ur metoh but still not working ...here is my code and i m
tired with this program . i am not getting even a single method to find
lexicographic shortest path.
#includestdio.h
int min1(int k,int m,int n)
{
int min;
min=k;
if(minm)
min=m;
if(minn)
min=n;
return(min);
}
main()
{
int
m1[100][100],a[100][100],i,j,m,n,min,k,arr[100],t,min2,t1,t2,t3,v1;
while(scanf(%d%d,m,n)==2)
{
for(i=0;im;i++)
for(j=0;jn;j++)
scanf(%d,a[i][j]);
for(i=0;im;i++)
m1[i][0]=a[i][0];
for(j=1;jn;j++)
for(i=0;im;i++)
m1[i][j]=a[i][j]+min1(m1[(i+m-1)%m][j-1],m1[i][j-1],m1[(i+1)%m][j-1]);
/*for(i=0;im;i++)
{
for(j=0;jn;j++)
printf(%d,m1[i][j]);
printf(\n);
}
printf(\n);*/
min2=m1[0][n-1];
k=0;
for(i=1;im;i++)
if(m1[i][n-1]min2)
{
min2=m1[i][n-1];
k=i;