那场1个题就晋级的初赛,我当时搞A题,弄了一个多小时。。。这个DP,在各种瞎搞,修改之后,过了。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <map> 5 #include <iostream> 6 using namespace std; 7 #define INF 100000000 8 int dp[201][201]; 9 int t[101],z[101]; 10 int main() 11 { 12 13 int N,K,D,S,i,j,k,u,ans,cas; 14 15 scanf("%d",&cas); 16 while(cas--) 17 { 18 scanf("%d%d%d%d",&N,&K,&D,&S); 19 for(i = 1;i <= K;i ++) 20 scanf("%d%d",&t[i],&z[i]); 21 for(i = 1;i <= K;i ++) 22 { 23 for(j = 1;j <= N;j ++) 24 dp[i][j] = INF; 25 } 26 for(i = 1;i <= z[1];i ++) 27 { 28 dp[1][i] = D + t[1]*i; 29 } 30 for(i = 2;i <= K;i ++) 31 { 32 for(j = 1;j <= N;j ++) 33 { 34 dp[i][j] = min(dp[i-1][j],dp[i][j]); 35 for(k = 1;k < i;k ++) 36 { 37 for(u = 1;u <= z[i];u ++) 38 { 39 if(t[i] >= t[k]&&j >= u) 40 dp[i][j] = min(dp[k][j-u] + D + t[i]*u,dp[i][j]); 41 } 42 } 43 } 44 } 45 ans = INF; 46 for(i = 1;i <= K;i ++) 47 ans = min(ans,dp[K][N]); 48 if(ans == INF) 49 printf("impossible\n"); 50 else 51 printf("%d\n",ans); 52 } 53 return 0; 54 }