生活随笔
收集整理的這篇文章主要介紹了
第一章 动态规划【未完结】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 數字三角形模型
- 1015. 摘花生【簡單的基本模型】
- 1018. 最低通行費【簡單】
- 1027. 方格取數【一般 / 摘花生走兩次】
- 最長上升子序列模型【LIS】
- 1017. 怪盜基德的滑翔翼【簡單模型】
- 1014. 登山【簡單擴展】
- 482. 合唱隊形【簡單擴展】
數字三角形模型
1015. 摘花生【簡單的基本模型】
https://www.acwing.com/problem/content/1017/
#include<bits/stdc++.h>
using namespace std
;
const int N
=1e3+10;
int t
,n
,m
,f
[N
][N
];
int main(void)
{cin
>>t
;while(t
--){cin
>>n
>>m
;for(int i
=1;i
<=n
;i
++)for(int j
=1;j
<=m
;j
++)cin
>>f
[i
][j
];for(int i
=1;i
<=n
;i
++)for(int j
=1;j
<=m
;j
++) f
[i
][j
]+=max(f
[i
-1][j
],f
[i
][j
-1]);cout
<<f
[n
][m
]<<endl
;}return 0;
}
1018. 最低通行費【簡單】
https://www.acwing.com/problem/content/1020/
題目說必須(2n-1)步,隱含的條件就是不會走回頭路。
#include<bits/stdc++.h>
using namespace std
;
const int N
=1e3+10;
int f
[N
][N
],n
;
int main(void)
{cin
>>n
;for(int i
=1;i
<=n
;i
++)for(int j
=1;j
<=n
;j
++) cin
>>f
[i
][j
];for(int i
=1;i
<=n
;i
++) f
[1][i
]+=f
[1][i
-1];for(int i
=1;i
<=n
;i
++) f
[i
][1]+=f
[i
-1][1];for(int i
=1;i
<=n
;i
++)for(int j
=1;j
<=n
;j
++) f
[i
][j
]=min(f
[i
-1][j
],f
[i
][j
-1])+f
[i
][j
];cout
<<f
[n
][n
]<<endl
;return 0;
}
1027. 方格取數【一般 / 摘花生走兩次】
https://www.acwing.com/problem/content/1029/
上圖摘自:小呆呆大佬https://www.acwing.com/solution/content/7164/
#include<bits/stdc++.h>
using namespace std
;
const int N
=15;
int f
[N
*2][N
][N
],w
[N
][N
],n
,x
,y
,c
;
int main(void)
{cin
>>n
;while(cin
>>x
>>y
>>c
,x
||y
||c
) w
[x
][y
]=c
;for(int k
=2;k
<=n
+n
;k
++){for(int i1
=1;i1
<=n
;i1
++){for(int i2
=1;i2
<=n
;i2
++){int j1
=k
-i1
,j2
=k
-i2
;if(j1
>=1&&j1
<=n
&&j2
>=1&&j2
<=n
){int t
=w
[i1
][j1
];if(i1
!=i2
) t
+=w
[i2
][j2
];int temp
=f
[k
][i1
][i2
];temp
=max(temp
,f
[k
-1][i1
-1][i2
-1]+t
);temp
=max(temp
,f
[k
-1][i1
-1][i2
]+t
);temp
=max(temp
,f
[k
-1][i1
][i2
-1]+t
);temp
=max(temp
,f
[k
-1][i1
][i2
]+t
);f
[k
][i1
][i2
]=temp
;}}}}cout
<<f
[n
*2][n
][n
]<<endl
;return 0;
}
最長上升子序列模型【LIS】
1017. 怪盜基德的滑翔翼【簡單模型】
https://www.acwing.com/problem/content/1019/
正著跑一遍,反著跑一遍,取一個max即可。
#include<bits/stdc++.h>
using namespace std
;
const int N
=110;
int t
,n
,a
[N
],f
[N
];
int main(void)
{cin
>>t
;while(t
--){cin
>>n
;for(int i
=1;i
<=n
;i
++) cin
>>a
[i
];int res
=0;for(int i
=1;i
<=n
;i
++){f
[i
]=1;for(int j
=1;j
<i
;j
++) if(a
[i
]>a
[j
]) f
[i
]=max(f
[i
],f
[j
]+1);res
=max(res
,f
[i
]);}for(int i
=n
;i
>=1;i
--){f
[i
]=1;for(int j
=n
;j
>i
;j
--) if(a
[i
]>a
[j
]) f
[i
]=max(f
[i
],f
[j
]+1);res
=max(res
,f
[i
]);}cout
<<res
<<endl
;}return 0;
}
1014. 登山【簡單擴展】
https://www.acwing.com/problem/content/1016/
正著跑一次,反著跑一次。
#include<bits/stdc++.h>
using namespace std
;
const int N
=1010;
int f1
[N
],f2
[N
],h
[N
],ans
,n
;
int main(void)
{cin
>>n
;for(int i
=1;i
<=n
;i
++) cin
>>h
[i
];for(int i
=1;i
<=n
;i
++){f1
[i
]=1;for(int j
=1;j
<i
;j
++) if(h
[j
]<h
[i
]) f1
[i
]=max(f1
[i
],f1
[j
]+1);ans
=max(ans
,f1
[i
]);}for(int i
=n
;i
>=1;i
--){f2
[i
]=1;for(int j
=n
;j
>i
;j
--) if(h
[i
]>h
[j
]) f2
[i
]=max(f2
[i
],f2
[j
]+1);ans
=max(ans
,f1
[i
]+f2
[i
]-1);}cout
<<ans
;return 0;
}
482. 合唱隊形【簡單擴展】
https://www.acwing.com/problem/content/484/
跟登山問題幾乎一樣,不過是對立的問題。
#include<bits/stdc++.h>
using namespace std
;
const int N
=250;
int f1
[N
],f2
[N
],h
[N
],n
,ans
;
int main(void)
{cin
>>n
;for(int i
=1;i
<=n
;i
++) cin
>>h
[i
];for(int i
=1;i
<=n
;i
++){f1
[i
]=1;for(int j
=1;j
<i
;j
++) if(h
[i
]>h
[j
]) f1
[i
]=max(f1
[i
],f1
[j
]+1);}for(int i
=n
;i
>=1;i
--){f2
[i
]=1;for(int j
=n
;j
>i
;j
--) if(h
[i
]>h
[j
]) f2
[i
]=max(f2
[i
],f2
[j
]+1);ans
=max(ans
,f1
[i
]+f2
[i
]-1);}cout
<<n
-ans
<<endl
;return 0;
}
總結
以上是生活随笔為你收集整理的第一章 动态规划【未完结】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。