1. 程式人生 > >考試反思(2019/1/26學習筆記)

考試反思(2019/1/26學習筆記)

公交 交換 一道 b- target pri -a += closed

1.公交換乘

一道很簡單的一維dp,很像這道題收費站

技術分享圖片
 1 /*
 2 id:Dear_prince 
 3 */ 
 4 const int maxn=1e6+5;
 5 int m,tot,a[205],f[212];
 6 void read()
 7 {
 8     for(int i=1;i<=10;i++)
 9         a[i]=quick();
10     m=quick();
11 }
12 void work()
13 {
14     memset(f,0x3f,sizeof(f));
15     for(int i=1;i<=10;i++)
16         f[i]=a[i];
17 for(int i=1;i<=m;i++) 18 for(int j=1;j<=10;j++) 19 f[i+j]=min(f[i]+a[j],f[i+j]); 20 printf("%d",f[m]); 21 }
Code

2.數字矩形

記搜

技術分享圖片
 1 /*
 2 id:Dear_prince 
 3 */ 
 4 #define INF 0x3f3f3f3f
 5 const int maxn=1e6+5;
 6 int n,m,f[105][505],a[105][505],ans=INF;
 7 int dx[]={1,0,0};
8 int dy[]={0,1,-1}; 9 void dfs(int x,int y) 10 { 11 if(x==n) 12 { 13 ans=min(ans,f[x][y]); 14 return; 15 } 16 if(x<1||x>n||y<1||y>m) 17 return; 18 if(f[x][y]>ans) 19 return; 20 for(int i=0;i<3;i++) 21 { 22 int xx=x+dx[i];
23 int yy=y+dy[i]; 24 if(f[xx][yy]>f[x][y]+a[xx][yy]) 25 { 26 f[xx][yy]=f[x][y]+a[xx][yy]; 27 dfs(xx,yy); 28 } 29 } 30 } 31 int main() 32 { 33 input(); 34 n=quick(); 35 m=quick(); 36 memset(f,0x3f,sizeof(f)); 37 for(int i=1;i<=n;i++) 38 for(int j=1;j<=m;j++) 39 a[i][j]=quick(); 40 for(int i=1;i<=m;i++) 41 f[1][i]=a[1][i]; 42 for(int i=1;i<=m;i++) 43 dfs(1,i); 44 printf("%d",ans); 45 return 0; 46 }
Code

3.排列

沒想到去重能有這麽多種姿勢

技術分享圖片
 1 /*
 2 id:Dear_prince 
 3 */ 
 4 const int maxn=1e6+5;
 5 int t,tot,p,mark;
 6 int a[20],f[5000][1200],b[15],ans,js[]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800};
 7 int main()
 8 {
 9     input();
10     t=quick();
11     while(t--)
12     {
13         memset(a,0,sizeof(a));
14         memset(b,0,sizeof(b));
15         memset(f,0,sizeof(f));
16         tot=0;
17         ans=0;
18         char ch=getchar();
19         if(ch==\n)
20             ch=getchar();
21         while(ch!= )
22         {
23             a[tot++]=ch-0;
24             b[ch-0]++;
25             ch=getchar();
26         }
27         p=quick();
28         //tot--;
29         f[0][0]=1;
30         for(int i=0;i<(1<<tot);i++)
31             for(int k=0;k<p;k++)
32                 if(f[i][k])
33                     for(int j=0;j<tot;j++)
34                         if((i&(1<<j))==0)
35                             f[i|(1<<j)][(k*10+a[j])%p]+=f[i][k];
36         ans=f[(1<<tot)-1][0];
37         for(int i=0;i<=9;i++)
38             ans/=js[b[i]];
39         printf("%d\n",ans);
40     }
41     return 0;
42 }
Code

考試反思(2019/1/26學習筆記)