关灯问题 dp

题意是一排路灯,每个路灯有耗电量,照明度,需要给这n个路灯按顺序分组,每组内的最大耗电量是电灯数乘t,可以选择关闭一些电灯,求最大的照明度;

这题思路很明显,预处理出一个g[i][j]表示i到j分为一组的最大照明度,f[i][j]表示前i个分为j组的最大照明度,f[i][j]=max(f[k-1][j-1]+f[k][i]);

朴素的预处理是这么搞的

 1 int h[maxm*maxn];
 2     for(int i=1;i<=n;i++)
 3         for(int j=i;j<=n;j++){
 4             memset(h,0,sizeof(h));
 5             int s=(j-i+1)*t;
 6             for(int k=i;k<=j;k++)
 7                 for(int c=s;c>=0;c--){
 8                     if(c<w[k])break;
 9                     h[c]=max(h[c],h[c-w[k]]+v[k]);
10                 }
11             g[i][j]=g[j][i]=h[s];
12         }
View Code

n^4,无法接受,观察了一下,发现h数组每次都这么清一遍太浪费了,要想想怎么从前面的h中获取信息,发现每次h中有i-j的最优信息,然后处理i-j+1的时候相当于又处理了一遍i-j,要找i-j+1的g值,可以考虑一下不清空h数组,直接从j+1向上搞,但是每次最大耗电量都不一样,直接可以设成i-n的最大耗电,然后每次处理完后,在1-当前最大耗电里找最大值就行了,省了一维,可以通过了;

修改代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 using namespace std;
 9 const int maxn=170,maxm=60;
10 int n,m,t,w[maxn],v[maxn];
11 int g[maxn][maxn],f[maxn][maxm];
12 void init(){
13     scanf("%d%d%d",&n,&m,&t);
14     for(int i=1;i<=n;i++)scanf("%d%d",&w[i],&v[i]);
15     int h[maxn*maxn];
16     for(int i=1;i<=n;i++){
17         memset(h,0,sizeof(h));
18         int s=(n-i+1)*t;
19         for(int j=i;j<=n;j++){
20             int S=(j-i+1)*t;
21             for(int c=s;c>=0;c--){
22                 if(c<w[j])break;
23                 h[c]=max(h[c],h[c-w[j]]+v[j]);
24             }
25             g[i][j]=g[j][i]=h[S];
26         }
27     }
28 }
29 void work(){
30     for(int i=1;i<=n;i++)
31         for(int k=1;k<=m&&k<=i;k++){
32             for(int j=k;j<=i;j++){
33                 f[i][k]=max(f[i][k],f[j-1][k-1]+g[j][i]);
34             }
35         }
36     cout<<f[n][m]<<endl;
37 }
38 int main(){
39     init();
40     work();
41 }
View Code

 

转载于:https://www.cnblogs.com/chadinblog/p/5846649.html

<Button android:id="@+id/AddKey" android:layout_width="70dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:text="+" /> <Button android:id="@+id/key1" android:layout_width="100dp" android:layout_height="40dp" android:text="KEY1" /> <TextView android:id="@+id/ShowKey1" android:layout_width="80dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1" android:gravity="center" android:text="r150" /> <TextView android:id="@+id/key1Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey1" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key1" /> <Button android:id="@+id/key1Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1Flashing" android:text="开" /> <Button android:id="@+id/key1Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1Start" android:text="关灯" /> <Button android:id="@+id/key2" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key1" android:text="KEY2" /> <TextView android:id="@+id/ShowKey2" android:layout_width="80dp" android:layout_height="40dp" android:layout_below="@+id/ShowKey1" android:layout_toRightOf="@+id/key2" android:gravity="center" android:text="r160" /> <TextView android:id="@+id/key2Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@+id/key1Flashing" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey2" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key2" /> <Button android:id="@+id/key2Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key1Start" android:layout_toRightOf="@+id/key2Flashing" android:text="开" /> <Button android:id="@+id/key2Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key1Close" android:layout_toRightOf="@+id/key2Start" android:text="关灯" /> <Button android:id="@+id/key3" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key2" android:text="KEY3" /> <TextView android:id="@+id/ShowKey3" android:layout_width="80dp" android:layout_height="40dp" android:layout_below="@+id/ShowKey2" android:layout_toRightOf="@+id/key3" android:gravity="center" android:text="r170" /> <TextView android:id="@+id/key3Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@+id/key2Flashing" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey3" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key3" /> <Button android:id="@+id/key3Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key2Start" android:layout_toRightOf="@+id/key3Flashing" android:text="开" /> <Button android:id="@+id/key3Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key2Close" android:layout_toRightOf="@+id/key3Start" android:text="关灯" /> <Button android:id="@+id/key4" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key3" android:text="KEY4" /> <TextView android:id="@+id/ShowKey4" android:layout_width="80dp" android:layout_height="40dp" android:layout_below="@+id/ShowKey3" android:layout_toRightOf="@+id/key4" android:gravity="center" android:text="r180" /> <TextView android:id="@+id/key4Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@+id/key3Flashing" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey4" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key4" /> <Button android:id="@+id/key4Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key3Start" android:layout_toRightOf="@+id/key4Flashing" android:text="开" /> <Button android:id="@+id/key4Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key3Close" android:layout_toRightOf="@+id/key4Start" android:text="关灯" /> <Button android:id="@+id/key5" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key4" android:text="KEY5" /> <TextView android:id="@+id/ShowKey5" android:layout_width="80dp" android:layout_height="40dp" android:layout_below="@+id/ShowKey4" android:layout_toRightOf="@+id/key5" android:gravity="center" android:text="r190" /> <TextView android:id="@+id/key5Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_below="@+id/key4Flashing" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey5" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key5" /> <Button android:id="@+id/key5Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key4Start" android:layout_toRightOf="@+id/key5Flashing" android:text="开" /> <Button android:id="@+id/key5Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_below="@+id/key4Close" android:layout_toRightOf="@+id/key5Start" android:text="关灯" /> </RelativeLayout>把以上区域变成可滚动区域,每次点击“+”按钮,在底部增加一行,每行的高度和宽度都和上面的一样<Button android:id="@+id/key1" android:layout_width="100dp" android:layout_height="40dp" android:text="KEY1" /> <TextView android:id="@+id/ShowKey1" android:layout_width="80dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1" android:gravity="center" android:text="r150" /> <TextView android:id="@+id/key1Flashing" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginRight="10dp" android:layout_toRightOf="@id/ShowKey1" android:background="@drawable/lamp_shape" android:gravity="center" android:text="key1" /> <Button android:id="@+id/key1Start" android:layout_width="100dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1Flashing" android:text="开" /> <Button android:id="@+id/key1Close" android:layout_width="100dp" android:layout_height="40dp" android:layout_toRightOf="@+id/key1Start" android:text="关灯" />
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值