2021.6.19 开心赛

题外话:今天考了一天的文化课,晚上到机房又要被开心赛鞭挞。嘤嘤嘤~

1.方格取数

这题已经老生常谈了,不再多说。建议做完之后做传纸条,一份题解,双份快乐。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int a[105][105];
 5 int sum[105][105][105][105]={};
 6 
 7 int main()
 8 {
 9     int x,y,z;
10     scanf("%d",&n);
11     scanf("%d %d %d",&x,&y,&z);
12     while(x&&y&&z)
13     {    
14         a[x][y]=z;
15         scanf("%d %d %d",&x,&y,&z);
16     }
17     for(int i=1;i<=n;i++)
18     {
19         for(int j=1;j<=n;j++)
20         {
21             for(int k=1;k<=n;k++)
22             {
23                 for(int h=1;h<=n;h++)
24                 {
25                     int max1=max(sum[i-1][j][k-1][h],sum[i][j-1][k][h-1]);
26                     int max2=max(sum[i-1][j][k][h-1],sum[i][j-1][k-1][h]);
27                     sum[i][j][k][h]=max(max1,max2)+a[i][j];
28                     if(i!=k&&j!=h)
29                     {
30                         sum[i][j][k][h]+=a[k][h];//加当前该点的 
31                     }
32                 }
33             }
34         }
35     }
36     printf("%d",sum[n][n][n][n]);
37     return 0;
38 }
39 /*
40 8
41 2 3 13
42 2 6 6 
43 3 5 7
44 4 4 14
45 5 2 21 
46 5 6 4
47 6 3 15
48 7 2 14
49 0 0 0
50 */

2.花店橱窗布置

这题我没看出来是区间dp.区间dp的题解我先咕一咕,今天实在不想写了。

先放个代码吧

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int f,v;
 4 int a[1005][1005],b[1005][1005]={},c[1005][1005];
 5 int bai[10005];
 6 int k;
 7 
 8 int main()
 9 {
10     scanf("%d %d",&f,&v);
11     memset(b,128,sizeof(b));  
12     for(int i=1;i<=v-f+1;i++)
13     {
14         b[1][i]=a[1][i];//第一行前只有第一行 
15     }
16     
17     for(int i=2;i<=f;i++)//放哪朵 
18     {
19         for(int j=i;j<=v-f+i;j++)
20         {
21             for(k=i-1;k<=j-1;k++) 
22             {
23                 /*b[i][j]=max(b[i-1][k]+a[i][j],b[i][j]);
24                 c[i][j]=k;*///不可以写成这个样子,if里有两句 
25                 if (b[i-1][k]+a[i][j]>b[i][j])
26                   {
27                        b[i][j]=b[i-1][k]+a[i][j];            
28                       c[i][j]=k;                      
29                   }  
30             }
31         }
32     }
33 
34 
35     int max=-2100000000;
36     for(int i=f;i<=v;i++)
37     {
38         if(b[f][i]>max)
39         {
40             max=b[f][i];
41             k=i;
42         }
43     }
44     printf("%d
",max);
45     for(int i=1;i<=f;i++)
46     {
47         bai[i]=k;
48         k=c[f-i+1][k];
49     }
50     for(int i=f;i>=2;i--)
51     {
52         printf("%d ",bai[i]);
53     }
54     printf("%d",bai[1]);
55     return 0;
56 }
57 /*
58 3 5
59 7 23 -5 -24 16 
60 5 21 -4 10 23 
61 -21 5 -4 -20 20
62 */
原文地址:https://www.cnblogs.com/TheZealous/p/14904668.html