今天练习赛的题目,我先读的,以为是图论,叫XSY去看,结果越弄越理不清头绪。。最后没办法只能放弃。
下午结束后才知道原来是道DP。以三辆车的位置为状态,j,k为不动的车位置,i为当前移动车的位置。dp[j,k,i]可由dp[j,k,i+1],dp[j,i,i+1],dp[k,i,i+1]移动一次达到。
另外长了个记性,以后绝对不再使用宏定义了,宏定义的取最值方法老是出错,找不出来原因。
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std ;
int data[ 31][ 31] ;
int dp[ 31][ 31][ 31] ;
int main(){
int t, n, i, j, k ;
scanf( " %d ", &t) ;
while(t--){
memset(dp, 0, sizeof(dp)) ;
scanf( " %d ", &n) ;
for(i= 1; i<n; i++)
for(j=i+ 1; j<=n; j++)
scanf( " %d ", &data[i][j]) ;
for(i=n- 1; i>= 1; i--)
for(j= 1; j<=i; j++)
for(k= 1; k<=i; k++){
dp[j][k][i] = min(dp[j][k][i+ 1]+data[i][i+ 1], dp[k][i][i+ 1]+data[j][i+ 1]) ;
dp[j][k][i] = min(dp[j][k][i], dp[j][i][i+ 1]+data[k][i+ 1]) ;
}
printf( " %d\n ", dp[ 1][ 1][ 1]) ;
}
return 0 ;}
#include<cstring>
#include<algorithm>
using namespace std ;
int data[ 31][ 31] ;
int dp[ 31][ 31][ 31] ;
int main(){
int t, n, i, j, k ;
scanf( " %d ", &t) ;
while(t--){
memset(dp, 0, sizeof(dp)) ;
scanf( " %d ", &n) ;
for(i= 1; i<n; i++)
for(j=i+ 1; j<=n; j++)
scanf( " %d ", &data[i][j]) ;
for(i=n- 1; i>= 1; i--)
for(j= 1; j<=i; j++)
for(k= 1; k<=i; k++){
dp[j][k][i] = min(dp[j][k][i+ 1]+data[i][i+ 1], dp[k][i][i+ 1]+data[j][i+ 1]) ;
dp[j][k][i] = min(dp[j][k][i], dp[j][i][i+ 1]+data[k][i+ 1]) ;
}
printf( " %d\n ", dp[ 1][ 1][ 1]) ;
}
return 0 ;}