考试反思(2019/1/26学习笔记)

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

猜你喜欢

转载自www.cnblogs.com/Achensy/p/10323096.html