LightOJ1119-Pimp My Ride-状态dp

来源:互联网 发布:折弯机编程软件 编辑:程序博客网 时间:2024/05/21 17:27

题目大意:给你n份工作,在做第i份工作之前,如果之前做了第j份工作,就需要加上price[i][j],问你怎么排列工作才能使得花费最少;

题目解析:很明显是状态dp,dp的时候枚举一下哪些做了就好了;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#define inf 0x3fffffffusing namespace std;long long dp[(1<<15)+10];int main(){int cas,cnt,i,j,k,mi,price[20][20],n,len;scanf("%d",&cas);cnt=0;while(cas--){scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&price[i][j]);}}len=1<<n;for(i=0;i<len;i++){dp[i]=inf;}dp[0]=0;for(i=0;i<len;i++){for(j=0;j<n;j++){if(!(i&(1<<j))){mi=0;for(k=0;k<n;k++){if(i&(1<<k))mi+=price[j][k];}dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+price[j][j]+mi);}}}printf("Case %d: %lld\n",++cnt,dp[len-1]);}return 0;}


0 0